树-堆结构练习——合并果子之哈夫曼树
2015-08-18 15:36
288 查看
树-堆结构练习——合并果子之哈夫曼树
题目描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入
第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个ai(1<=ai<=20000)是第i个果子的数目。输出
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。示例输入
3 1 2 9
示例输出
15
#include<bits/stdc++.h> #define L long long //第一次见的定义方法 L s; using namespace std; int main() { std::ios::sync_with_stdio(false); L n,m; priority_queue<L,vector<L>,greater<L> >q; while(cin>>n) { L a,b,z; s=0; while(n--) { cin>>m; q.push(m); } while(!q.empty()) { a=q.top(); q.pop(); //出队加到a上 if(!q.empty()) { b=q.top(); //出队加到b上 q.pop(); z=a+b; s+=z; q.push(z); //将相加的和再次送入队列中 } } cout<<s<<endl; //最后输出总和 } return 0; }
相关文章推荐
- hdu 4548 第六周H题(美素数)
- jquery selector 基础
- SoundPool
- 两个数种输出最大最小值
- 将VC++动态链接库封装成C#可以用的动态链接库步骤
- Lucene经典学习资料(不断更新)
- c++面向对象编程必备“良方”
- 有关openCV在QT环境的配置
- 判断以逗号分隔的字符串中是否包含某个数
- maven的一些内置变量和常识
- 图的遍历之 深度优先搜索和广度优先搜索
- creationComple
- Android 4.4 自动拨打分机流程分析
- 数据结构实验之求二叉树后序遍历和层次遍历
- 人脸性别识别文献阅读笔记(1)
- poj 1160 Post Office (间隔DP)
- 宜家的幸福生活,源于K2 BPM的支撑
- maven Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:
- jUnity单元测试
- MySQL数据迁移实战