L - 树-堆结构练习——合并果子之哈夫曼树

题目链接: link.

题目描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过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

提示
该题目用堆做,写删除函数时较为复杂,所以可以考虑优先队列。

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。

优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

下面是优先队列的使用方法

首先要包含头文件

#include<queue>
```和队列基本操作相同:top() 访问队头元素
empty() 队列是否为空
size() 返回队列内元素个数
push() 插入元素到队尾 (并排序)
emplace() 原地构造一个元素并插入队列
pop() 弹出队头元素
swap ()交换内容priority_queue<int,vector<int>,greater<int> > q;//定义小顶堆priority_queue<int,vector<int>,less<int> > q;//定义大顶堆
priority_queue<int>//默认为定义的大顶堆
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

下面是这道题用优先队列的解法

#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int N=100001;
int M=0x3f3f3f3f;
int top[N];
priority_queue<int,vector<int>,greater<int> > q;int main()
{int n,i,j,y,z;cin>>n;for(i=0;i<n;i++){int x;cin>>x;q.push(x);}int ans=0;for(i=0;i<n-1;i++){y=q.top();q.pop();z=q.top();q.pop();q.push(y+z);ans=ans+y+z;}cout<<ans<<endl;return 0;
}

L - 树-堆结构练习——合并果子之哈夫曼树相关推荐

  1. SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...

  2. 树-堆结构练习——合并果子之哈夫曼树oj

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 在一个果园里,多多已经将所有的果子打了下 ...

  3. 树-堆结构练习——合并果子之哈夫曼树

    树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...

  4. 树-堆结构练习——合并果子之哈夫曼树(是最优二叉树题目的缩影)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个果园里,多多已经将所有的果子 ...

  5. 树-堆结构练习——合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip ...

  6. java合并果子_C++(STL)树-堆结构练习——合并果子之哈夫曼树

    priority_queue 对于基本类型的使用方法相对简单. 他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functiona ...

  7. sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列

    Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...

  8. Vijos P1097 合并果子【哈夫曼树+优先队列】

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  9. 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现

    78 /*-----------创建工作---------------------------*/ 79     int s1,s2; 80     for (int i = n + 1; i < ...

最新文章

  1. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
  2. 【Java 集合】Java 集合主要脉络 ( Collection | Map | List | Set )
  3. 012_日期内建函数
  4. 文献记录(part68)--K- 近邻分类器鲁棒性验证:从约束放松法到随机平滑法
  5. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...
  6. php mssql_init,Php Mssql操作简单封装支持存储过程
  7. grDevices | R语言中的配色方法汇总(Ⅱ-2)
  8. html div画圆有什么用,圆形div栏,用于评级html5 js(Circle div bar for rating html5 js)
  9. 广度优先搜索(啊哈算法)
  10. 清华大学829电磁场考研资料
  11. 给大学生的劝告——你们为何应该开始接触UNIX/Linux
  12. bootstrap重置按钮
  13. OpenWrt ADSL单线多拨,负载均衡(仅供参考)
  14. html页面设计扁平化,50个漂亮的扁平化网页设计欣赏
  15. wed基础和http
  16. URAL 1671 Anansi's Cobweb (并查集)
  17. ESP32 报错is installed, but the tool failed to run
  18. Tensorflow之基于MNIST手写识别的入门介绍
  19. PMP项目管理—质量情景题
  20. linux获取偶数行内容,linux命令(39):shell 打印偶数行,奇数行 ,行号

热门文章

  1. 数学建模学习(66):支持向量机 (SVM)案例实战
  2. 新品发布:HoneyPillow,您的私人梦境记录仪
  3. 安卓模拟器报错:Error while waiting for device: The emulator process for AVD Nexus_6P_API_30 has terminated.
  4. [计算机数值分析]高斯-塞德尔迭代公式解线性方程组
  5. 【多校连萌2】1281: 邪能炸弹【补题】
  6. C语言 scpi命令解释器,基于Python的SCPI命令解释器的设计
  7. MySQL中数据类型的长度问题解析
  8. 考研励志--我考研时觉得非常好的一篇文章,适用于考研新手
  9. 【显示器】关于自制显示器的两三事 其二
  10. java花星星 星星大小随机_java 在窗口中用*号,随机画星星和满月