ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
Problem D: (ds:树)合并果子
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 80 Solved: 4
[Submit][Status][Web
Board]
Description
在一个果园,多多已经将所有的果子都打了下来,而且按照果子的不同种类分成了不同的堆,多多决定将所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,经过n-1次合并之后,就剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为多多还要花大力气把这些果子搬回家,所以多多在合并果子时要要尽可能地节省体力。假定每个果子的重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最小,并输出这个最小的体力耗费值。
假如有3种果子,数目依次为1、2、9,可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗体力=3+12=15。可以证明15为最小的体力耗费值。
Input
输入第一行为整数M,表示有M个case(测试实例)。
接下来每个case包含2行,第一行为整数n(1<=n<=10,000),表示果子的种类数,第二行包含n个整数,用空格分开,分别表示有每种果子的数目。
Output
每个case输出最小的体力耗费值
Sample Input
2
3
1 2 9
4
1 2 9 4
Sample Output
15
26
由于不懂数据结构,只能用优先队列来做了。做法:每次合并当前最小的两堆,将合并之后的堆插入原来的序列中并保持有序。本想一路sort,后来想想类似的容器也可以做到啊,于是尝试了一下只是在紫书上看到过的优先队列。就是自定义比较规则需要稍微改动一下。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
int main (void)
{
int t,i,j,ans,n,num,temp;
cin>>t;
while (t--)
{
priority_queue<int,vector<int>,greater<int> >pos;
cin>>n;
for (i=0; i<n; i++)
{
cin>>num;
pos.push(num);
}
ans=0;
temp=0;
int cnt=0;
if(n==1)//一个的情况下特判掉,不然会输出0
{
cout<<pos.top()<<endl;
}
else
{
while (!pos.empty())//模拟
{
temp=temp+pos.top();
cnt++;
pos.pop();
if(cnt%2==0)
{
ans=ans+temp;
pos.push(temp);
cnt=0;
temp=0;
}
}
cout<<ans<<endl;
}
}
return 0;
}
ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)的更多相关文章
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- 赫夫曼树JAVA实现及分析
一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- 树&二叉树&哈夫曼树
1.树 需要注意的两点:n(n>=0)表示结点的个数,m表示子树的个数 (1)n>0时,树的根节点是唯一的. (2)m>0时,子树的个数没有限制. 结点的度和树的度 (1)结点的度是 ...
- puk1521 赫夫曼树编码
Description An entropy encoder is a data encoding method that achieves lossless data compression by ...
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
随机推荐
- HTML5新增的音频标签、视频标签
我们所说的H5就是我们所说的HTML5中新增的语言标准 一.音频标签 在HTML5当中有一个叫做audio的标签,可以直接引入一段音频资源放到我们的网页当中 格式: <audio autopla ...
- Mybatis中关于OGNL表达式冲突
注意设计表字段不能用bor xor and band eq neq lt gt lte gte shl shr ushr
- java基础—多态(动态加载)
一.面向对象最核心的机制——动态绑定,也叫多态
- Android驱动开发读书笔记五
第五章 本章介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android. 1.安装串口调试工具minicom 首先需要一根USB转串口线,由 ...
- Golang Json测试
结构体是谷歌搜索API package main import ( "encoding/json" "fmt" "io/ioutil" &q ...
- pip 常用命令
列出已安装包 pip freeze or pip list 安装包 在线安装包 pip install <package name> 或 pip install -r requiremen ...
- VMware虚拟网卡介绍和使用说明
介绍VMware三种网络连接模式的详细配置及规则 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/p/9455391 ...
- 设置mysql允许外部连接访问
错误信息: SQL Error (1130): Host ‘192.168.1.88’ is not allowed to connect to this MySQL server 说明所连接的用户帐 ...
- linux下的一些命令分析与shell的一些命令
对> 与 >>的理解 echo "aaa" > aaa.txt 这个是在aaa.txt中写入aaa 可以用cat aaa.txt查看 echo &qu ...
- GoF23种设计模式之行为型模式之命令模式
一.概述 将一个请求封装为一个对象,从而可以使用不同的请求对客户端进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 二.适用性 1.当抽象出待执行的动作以参数化某个对象的时候. 2.当需要在 ...