题目描述:

哈夫曼树,第一行输入一个数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:哈夫曼树相关推荐

  1. 九度OJ 题目1179:阶乘

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1179:阶乘 * 来源:http://ac.jo ...

  2. 九度OJ 题目1069:查找学生信息 随笔

    ** 九度OJ 题目1069:查找学生信息 ** 题目描述如下: 输入N个学生的信息,然后进行查询. 输入 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息 ...

  3. 九度OJ 题目1203:IP地址

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1203:IP地址 * 来源:http://ac. ...

  4. 九度OJ——1172哈夫曼树

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

  5. 九度OJ—题目1032:ZOJ

    题目描写叙述: 读入一个字符串.字符串中包括ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出.当某个字符用完时,剩下的仍然依照ZOJ的顺序输出. 输入: 题目包括多组用例,每组用例占一行,包括ZOJ ...

  6. 九度oj 题目1411:转圈

    题目描述: 在一个有向图有n个顶点(编号从1到n),给一个起点s,问从起点出发,至少经过一条边,回到起点的最短距离. 输入: 输入包括多组,每组输入第一行包括三个整数n,m,s(1<=n< ...

  7. 【WA】九度OJ题目1435:迷瘴

    题目描述: 通过悬崖的yifenfei,又面临着幽谷的考验-- 幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅.由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死. 幸好y ...

  8. 九度oj 题目1354:和为S的连续正数序列

    题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...

  9. 九度oj 题目1376:最近零子序列

    题目描述: 给定一个整数序列,你会求最大子串和吗?几乎所有的数据结构与算法都会描述求最大子串和的算法.今天让大家来算算最近0子串和,即整数序列中最接近0的连续子串和.例如,整数序列6, -4, 5, ...

最新文章

  1. Php的if自动转换类型,php之数据类型自动转换,php之数据类型转换_PHP教程
  2. 【RAC】RAC 实现IP访问控制
  3. Linkedin 工程师如何优化他们的 Java 代码
  4. 用python开发的网站多吗-django可以开发大型网站吗
  5. php -q poller.php --force,cacti 安装后没有图像
  6. 联想服务器开启虚拟化,联想电脑虚拟化开启方法
  7. 地图标记点击成超链接_纯干货!株洲100多家美食地图!国庆收藏!
  8. 华为S5300系列交换机V100R005SPH020升级补丁
  9. CentOS8安装nginx详细教程
  10. JDK8相对于JDK7的一些新特性
  11. 冲压工艺中常见的问题,值得收藏
  12. linux查看实时的日志命令,Linux实时查看日志的四种命令详解
  13. HTML中的三目表达式可以有多长
  14. 以太网通信协议UDP
  15. 4星|《激荡十年,水大鱼大》:过去十年间国内商业简史
  16. <论文阅读>用于 3D 点线和平面的视觉惯性里程计框架 A Visual Inertial Odometry Framework for 3D Points, Lines and Planes
  17. 数据库-查询第二高的薪水
  18. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
  19. NPOI之Excel-设置单元格背景色-色表
  20. 中国墨子号卫星首次实现1200公里量子纠缠,震惊国外专家

热门文章

  1. Prophet时间序列
  2. 有一行电文,已按下面规律译成密码: a→z b→y c→x A→Z B→Y C→X ,输出原文
  3. 试图将文件指针移动到文件开头之前
  4. 绘画技巧:怎样才能画好动漫人物身体比例?
  5. C#实现水晶报表绑定数据并实现打印4-条形码
  6. php 设置中文字体,css设置不了中文字体怎么办
  7. win8计算机虚拟内存,win8电脑虚拟内存设置多少最好
  8. 体育直播APP开发具备哪些功能
  9. 关于 M8的出厂日期
  10. 2018android手机机皇,2018年旗舰基本面世,这四台手机是否你眼中的安卓机皇?