九度oj 题目1172:哈夫曼树
- 题目描述:
-
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
- 输入:
-
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
- 输出:
-
输出权值。
- 样例输入:
-
5 1 2 2 5 9
- 样例输出:
-
37 权值为层数,从0开始,一开始本来想用数组来构造哈夫曼树,代码如下:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 7 #define MAX 1009 8 #define HMAX 2009 9 10 struct Haff 11 { 12 int level; 13 int key; 14 bool isLeaf; 15 }; 16 Haff haff[MAX]; 17 18 int cmp(const void* a, const void *b) { 19 Haff at = *(Haff *)a; 20 Haff bt = *(Haff *)b; 21 if(at.key != bt.key) 22 return at.key - bt.key; 23 else if(at.isLeaf == bt.isLeaf) { 24 return 0; 25 } 26 else { 27 if(at.isLeaf == true) { 28 return 1; 29 } 30 else { 31 return -1; 32 } 33 } 34 } 35 36 int max(int a, int b) { 37 return a > b ? a: b; 38 } 39 int main(int argc, char const *argv[]) 40 { 41 int n; 42 while(scanf("%d",&n) != EOF) { 43 for(int i = 0; i < n; i++) { 44 scanf("%d",&haff[i].key); 45 haff[i].level = 1; 46 haff[i].isLeaf = true; 47 } 48 int ptr = 0; 49 int count = n; 50 int cen; 51 int N = 2 * n - 1; 52 while(ptr < N - 2) { 53 qsort(&haff[ptr],count-ptr, sizeof(Haff), cmp); 54 55 int pj = ptr + 1; 56 cen = max(haff[ptr].level, haff[pj].level); 57 haff[ptr].level = cen; 58 haff[pj].level = cen; 59 haff[count].key = haff[ptr].key + haff[pj].key; 60 haff[count].level = cen + 1; 61 haff[count].isLeaf = false; 62 count++; 63 ptr = ptr + 2; 64 } 65 66 int sum = 0; 67 cen = haff[N-1].level; 68 69 /*for(int i = 0; i < count; i++) { 70 printf("%d %d\t",haff[i].key, haff[i].level); 71 } 72 printf("\n");*/ 73 for(int i = 0; i < count; i++) { 74 if(haff[i].isLeaf == true) { 75 sum = sum + (cen - haff[i].level) * haff[i].key; 76 } 77 } 78 printf("%d\n",sum); 79 } 80 return 0; 81 } 82
但这样做,level的值会出现错误。
后来发现去计算答案根本不需要建树,代码如下:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 7 #define MAX 1009 8 9 int haff[MAX]; 10 11 int cmp(const void* a, const void *b) { 12 int at = *(int *)a; 13 int bt = *(int *)b; 14 return at - bt; 15 16 } 17 18 int max(int a, int b) { 19 return a > b ? a: b; 20 } 21 int main(int argc, char const *argv[]) 22 { 23 int n; 24 while(scanf("%d",&n) != EOF) { 25 for(int i = 0; i < n; i++) { 26 scanf("%d",&haff[i]); 27 } 28 int ptr = 0; 29 int count = n; 30 int N = 2 * n - 1; 31 int sum = 0; 32 while(ptr < N - 2) { 33 qsort(&haff[ptr],count-ptr, sizeof(int), cmp); 34 35 int pj = ptr + 1; 36 haff[count] = haff[ptr] + haff[pj]; 37 sum = sum + haff[count]; 38 count++; 39 ptr = ptr + 2; 40 } 41 printf("%d\n",sum); 42 } 43 return 0; 44 }
转载于:https://www.cnblogs.com/jasonJie/p/5687847.html
九度oj 题目1172:哈夫曼树相关推荐
- 九度OJ 题目1179:阶乘
/********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1179:阶乘 * 来源:http://ac.jo ...
- 九度OJ 题目1069:查找学生信息 随笔
** 九度OJ 题目1069:查找学生信息 ** 题目描述如下: 输入N个学生的信息,然后进行查询. 输入 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息 ...
- 九度OJ 题目1203:IP地址
/********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1203:IP地址 * 来源:http://ac. ...
- 九度OJ——1172哈夫曼树
题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入: 输入有 ...
- 九度OJ—题目1032:ZOJ
题目描写叙述: 读入一个字符串.字符串中包括ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出.当某个字符用完时,剩下的仍然依照ZOJ的顺序输出. 输入: 题目包括多组用例,每组用例占一行,包括ZOJ ...
- 九度oj 题目1411:转圈
题目描述: 在一个有向图有n个顶点(编号从1到n),给一个起点s,问从起点出发,至少经过一条边,回到起点的最短距离. 输入: 输入包括多组,每组输入第一行包括三个整数n,m,s(1<=n< ...
- 【WA】九度OJ题目1435:迷瘴
题目描述: 通过悬崖的yifenfei,又面临着幽谷的考验-- 幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅.由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死. 幸好y ...
- 九度oj 题目1354:和为S的连续正数序列
题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...
- 九度oj 题目1376:最近零子序列
题目描述: 给定一个整数序列,你会求最大子串和吗?几乎所有的数据结构与算法都会描述求最大子串和的算法.今天让大家来算算最近0子串和,即整数序列中最接近0的连续子串和.例如,整数序列6, -4, 5, ...
最新文章
- Php的if自动转换类型,php之数据类型自动转换,php之数据类型转换_PHP教程
- 【RAC】RAC 实现IP访问控制
- Linkedin 工程师如何优化他们的 Java 代码
- 用python开发的网站多吗-django可以开发大型网站吗
- php -q poller.php --force,cacti 安装后没有图像
- 联想服务器开启虚拟化,联想电脑虚拟化开启方法
- 地图标记点击成超链接_纯干货!株洲100多家美食地图!国庆收藏!
- 华为S5300系列交换机V100R005SPH020升级补丁
- CentOS8安装nginx详细教程
- JDK8相对于JDK7的一些新特性
- 冲压工艺中常见的问题,值得收藏
- linux查看实时的日志命令,Linux实时查看日志的四种命令详解
- HTML中的三目表达式可以有多长
- 以太网通信协议UDP
- 4星|《激荡十年,水大鱼大》:过去十年间国内商业简史
- <论文阅读>用于 3D 点线和平面的视觉惯性里程计框架 A Visual Inertial Odometry Framework for 3D Points, Lines and Planes
- 数据库-查询第二高的薪水
- android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
- NPOI之Excel-设置单元格背景色-色表
- 中国墨子号卫星首次实现1200公里量子纠缠,震惊国外专家
热门文章
- Prophet时间序列
- 有一行电文,已按下面规律译成密码: a→z b→y c→x A→Z B→Y C→X ,输出原文
- 试图将文件指针移动到文件开头之前
- 绘画技巧:怎样才能画好动漫人物身体比例?
- C#实现水晶报表绑定数据并实现打印4-条形码
- php 设置中文字体,css设置不了中文字体怎么办
- win8计算机虚拟内存,win8电脑虚拟内存设置多少最好
- 体育直播APP开发具备哪些功能
- 关于 M8的出厂日期
- 2018android手机机皇,2018年旗舰基本面世,这四台手机是否你眼中的安卓机皇?