哈夫曼树 - 九度教程第30题

题目:

时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出:
输出权值。
样例输入:
5
1 2 2 5 9
样例输出:
37
来源:
2010年北京邮电大学计算机研究生机试真题

使用优先队列以后,求哈夫曼树的过程不仅时间复杂度降低许多(O(nlogn)),同时代码也轻便不少,所以使用数据结构堆辅助求解哈夫曼树,是求哈夫曼树的最佳选择。在实际运用中确定哈夫曼树模型,最经典的问题模型为哈夫曼编码、多个数的两两合并等。

代码:

#include<stdio.h>
#include<queue>     //标准模板库<queue>
using namespace std;priority_queue<int,vector<int>,greater<int> > Q;//建立一个小顶堆int main()
{int n;while(scanf("%d",&n)!=EOF){while(Q.empty()==false) Q.pop();  //清堆中元素for(int i=1;i<=n;i++)             //输入n个叶子节点的权值{int x;scanf("%d",&x);Q.push(x);                    //将权值放入堆中}int ans=0;         //保存答案while(Q.size()>1)  //当堆中元素大于1个{int a=Q.top();Q.pop();int b=Q.top();Q.pop();       //取出堆中两个最小元素,它们为同一个结点的左右儿子//且该双亲结点的权值为它们的和ans+=a+b;      //该父亲结点必为非叶子节点,固累加其权值Q.push(a+b);   //将该双亲结点的权值放回堆中}printf("%d\n",ans);//输出答案}return 0;
}

例3.3 哈夫曼树 - 九度教程第30题(哈夫曼树)相关推荐

  1. Piggy-Bank - 九度教程第 102 题

    Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...

  2. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  3. 不容易系列之一(九度教程第 94 题)

    不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...

  4. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  5. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  6. 九度oj 题目1172:哈夫曼树

    题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入: 输入有 ...

  7. 九度oj 第1题 二维数组中的查找 何海涛:《剑指Offer:名企面试官精讲典型编程题》

    一.题目信息 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: ...

  8. 成绩排序 九度教程c语言,九度OJ 1089 数字反转

    题目分析: 使用队列存放每一位的数字,然后输出并计算得到反转数值,从而实现数字反转. 源代码: [cpp] #include #include using namespace std; int mai ...

  9. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  10. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

最新文章

  1. python的__get__、__set__、__delete__(1)
  2. PAT甲级1027 Colors in Mars :[C++题解]进制位
  3. mina 粘包、多包和少包的解决方法
  4. unix环境高级编程基础知识之第二篇(3)
  5. 红黑树实现——STL中的map
  6. 08 | RNN 与 LSTM:模型也可以持续不断地思考
  7. linux系统调用函数---12
  8. SecureCRT日志上添加时间戳
  9. 设计模式快速学习(五)原型模式
  10. 常见错误及细小知识点锦集
  11. EasyUi-1 拖放
  12. JS中的语音识别——Speech Recognition API
  13. 游戏开发筑基之特殊输入函数的妙用(C语言)
  14. Python的包管理工具
  15. 优雅的监听软键盘隐藏
  16. 无需服务端的多平台同步利器(btsync)
  17. linux移动硬盘hd0,怎样将UbuntuLinux系统放到移动硬盘?
  18. 网页里面嵌入视频代码
  19. 众数问题c语言编程,C语言 众数问题
  20. 横河变送器EJA110E-JMS4J-919EA

热门文章

  1. V-rep学习笔记:转动关节1
  2. 清华大学中国人工智能学会:2019人工智能发展报告
  3. 传智播客Java实现键盘数据的录入和if
  4. Atitit git 使用法v2 目录 1. Git客户端工具 1 1.1. Tortoisegit git gui 图形化工具。。 1 1.2. Ide中的git插件(eclipse idea
  5. Atitit m4a文件元数据结构 目录 1. 一、基本概念 1 2. MP4文件由若干称为Atom(或称为box)的数据对象组成, 2 2.1. MP4文件概述 2 2.2. M4A没有视频流而已
  6. atitit.颜色查找 根据范围 图像处理 inRange
  7. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
  8. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭
  9. paip.编程压缩Access数据库
  10. paip.设置鼠标灵敏度API