2-5 修理牧场 (35分)

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L​i​​ 的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式:

输入首先给出正整数N(≤104),表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度。

输出格式:

输出一个整数,即将木头锯成N块的最少花费。

输入样例:

8
4 5 1 2 1 3 1 1

输出样例:

49

代码如下:

#include <iostream>
#include <queue>
using namespace std;

//利用优先队列(数据类型为小顶堆)来模拟构造哈夫曼树
int main()
{
    int n, m;  
	//   这里一定要有空格,不然就变成了右移运算符↓
    priority_queue<int, vector<int>, greater<int> > q;      //因为要取最小值,所以采用升序(小顶堆) 
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> m;
        q.push(m);  //插入元素到队尾 (并排序)
    }
    int sum = 0, x1, x2;  //x1,x2取当前队列中的最小值 
    while(!q.empty())
    {
        x1 = q.top();  //最小值在队首
        q.pop();
        if(q.empty()) break;
        x2 = q.top();
        q.pop();
        x1 += x2;
        sum += x1;  //将每一次锯木头的花费累加 
        q.push(x1);  //相当于生成的哈夫曼树新结点插入
    }
    cout << sum << endl;
    return 0;
}

解题思路:

该题求将木头锯成N块的最少花费,阅读题目后我们可以知道若想 求得最少花费 ,则需每一次锯的木头的长度为最小值 ,而每一次锯的长度 逆推的话是由锯开后的两段木头 组成的,该题的输入里给出N个正整数表示每段木块的长度,所以想要让锯的木头长度为最小值,即转化为求当前的N个数中的最小的两个数,将它们相加就是每一次锯木头的最少花费
这刚好是在构建一棵 哈夫曼树(最优二叉树)
因为每次都需要找到当前所有数中的最小值,所以可以利用优先队列直接拿最小值来用就行

下面我对优先队列进行一个简单的介绍:

优先队列(priority queue)

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。

//以下解释为转载的内容(原文链接在文章末尾)
定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:

//升序队列
priority_queue <int, vector<int>, greater<int> > q;
//降序队列
priority_queue <int, vector<int>, less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

这里是两篇推荐的跟本文相关的文章

发布了12 篇原创文章 · 获赞 24 · 访问量 2608

猜你喜欢

转载自blog.csdn.net/qq_43974000/article/details/103671000