九度1172解题报告
2014-03-01 20:16
351 查看
http://ac.jobdu.com/problem.php?pid=1172
这道题原来做过可是一点印象都没有,竟然还是能想到用priority_queue来做,看来之前的练习还是有效果。其实今年考研408的算法题与这道题类似,但我当时并不知道这个结论:哈夫曼树所有叶节点的权重之和等于所有非叶结点的值的和,所以当时费了大量的时间做那道题,以至于组成原理的两道大题几乎完全没做,想想就心痛。不过如今逆袭了,也算比较心安。因为构造哈夫曼树的时候总是要取两个权值最小的结点,构造好的新非叶结点又要重新放回去筛选,如果反复排序会大大增加时间复杂度,所以用小顶堆解决这个问题就会容易许多,即用STL里的priority_queue来实现。代码如下:
这道题原来做过可是一点印象都没有,竟然还是能想到用priority_queue来做,看来之前的练习还是有效果。其实今年考研408的算法题与这道题类似,但我当时并不知道这个结论:哈夫曼树所有叶节点的权重之和等于所有非叶结点的值的和,所以当时费了大量的时间做那道题,以至于组成原理的两道大题几乎完全没做,想想就心痛。不过如今逆袭了,也算比较心安。因为构造哈夫曼树的时候总是要取两个权值最小的结点,构造好的新非叶结点又要重新放回去筛选,如果反复排序会大大增加时间复杂度,所以用小顶堆解决这个问题就会容易许多,即用STL里的priority_queue来实现。代码如下:
#include <stdio.h> #include <queue> using namespace std; priority_queue <int,vector<int>,greater<int> > q; //声明小顶堆 int main() { int n; while (scanf("%d",&n)!=EOF) { while (!q.empty()) q.pop(); for (int i=0;i<n;++i) { int x; scanf("%d",&x); q.push(x); } if (n==1) { printf("%d\n",q.top()); continue; } int ans=0; while(q.size()>1) { int temp=q.top(); q.pop(); temp+=q.top(); q.pop(); ans+=temp; q.push(temp); } printf("%d\n",ans); } return 0; }
相关文章推荐
- Hibernate的关联映射---6.1.2: 单向1-1关联
- eclipse插件安装说明及使用方式
- OLAP 大表和小表并行hash join
- SQLServer2008设置开启远程连接
- Python 学习笔记
- 手工建库方法
- java 7之万事开头难
- python 环境搭建
- 数码管显示按键对应的数字
- SQLServer2008设置开启远程连接
- OLAP 大表和小表并行hash join
- Hibernate的关联映射---6.1.1: 单向n-1关联
- cocos2d-x2.2.2版本+CocoStudio1.20使用问题
- NHibernate初学一之简单增删改查
- MD5加盐处理
- 五种I/O 模式—阻塞(默认IO模式),非阻塞,I/O多路复用,信号I/O,异步I/O
- Linux系统下基于PMIPv6的-解决内网访问外网部分网站打不开,或者很慢的问题
- C语言中auto,register,static,extern,volatile,restrict,const的区别
- linux下利用valgrind工具进行内存泄露检测和性能分析
- COM, COM+ and .NET 的区别