OJ3RD 1132 哈弗曼编码 - 贪心算法&哈夫曼树
2015-12-22 20:54
337 查看
链接:http://acm.buaa.edu.cn/problem/1132/
因为数据比较小就没怎么做优化
顺便学习了一下哈夫曼编码...照着它说的把哈夫曼树立起来,然后报告文件大小就行了..
另外发现gcc有个怪脾气,struct内变量不能简单地像parent=-1这样初始赋值,而是要用如下代码中方法写一个构造函数
这和vs上有区别,vs 上前者是能通过的,但是gcc上会报compile error
因为数据比较小就没怎么做优化
顺便学习了一下哈夫曼编码...照着它说的把哈夫曼树立起来,然后报告文件大小就行了..
另外发现gcc有个怪脾气,struct内变量不能简单地像parent=-1这样初始赋值,而是要用如下代码中方法写一个构造函数
这和vs上有区别,vs 上前者是能通过的,但是gcc上会报compile error
#include<iostream> #include<cstdio> using namespace std; const int MAX = 0x3f3f3f3f; struct huffmannode { int weight; int parent, lchild, rchild; huffmannode() :parent(-1), lchild(-1), rchild(-1) {} }; huffmannode HF[1000]; int N; void build_huffman_tree() { for (int i = 0; i < N - 1; i++) { int m1 = MAX, m2 = MAX; int x1 = 0, x2 = 0; for (int j = 0; j < i + N; j++) { if (HF[j].weight < m1&& HF[j].parent == -1) { m2 = m1; x2 = x1; m1 = HF[j].weight; x1 = j; } else if (HF[j].weight < m2&& HF[j].parent == -1) { m2 = HF[j].weight; x2 = j; } } HF[x1].parent = N + i; HF[x2].parent = N + i; HF[N + i].weight = HF[x1].weight + HF[x2].weight; HF[N + i].lchild = x1; HF[N + i].rchild = x2; } } int dist(int i) { if (HF[i].parent == -1) return 0; else return dist(HF[i].parent) + 1; } int main() { while (~scanf("%d", &N)) { for (int i = 0; i < 2 * N - 1; i++) HF[i].lchild = HF[i].rchild = HF[i].parent = -1; for (int i = 0; i < N; i++) scanf("%d", &(HF[i].weight)); build_huffman_tree(); int ans = 0; for (int i = 0; i < N; i++) ans += HF[i].weight*dist(i); printf("%d\n", ans); } return 0; }
相关文章推荐
- iOS CoreData(Swift版本)
- 南邮编程在线编程题十六:求平均值和最大值
- 直观解释-小波变换(一)
- C# Redis实战(七)
- QT实现,通过URL下载文件的接口实现
- Swift Explore - 关于 Swift 中的 isEqual 的一点探索
- 期末总结
- kubernetes 安装报错:File "<string>", line 1 import string,random; print "".join(random.SystemRandom(
- 136 Single Number
- 文章标题
- C# Redis实战(六)
- Maximum Product of Word Lengths | LeetCode
- 杨小麦iOS学习笔记--JSON数据处理
- HDU1176 免费馅饼(简单dp)
- jps 命令使用
- android 动画总结
- map根据值排序,字典排序,读入带空格的字符串处理
- C# Redis实战(五)
- qt-example之animated picture的学习
- jsp综合应用之标准化考试