UVA_12676_Inverting Huffman(哈夫曼树)
来源:互联网 发布:机票数据出售 编辑:程序博客网 时间:2024/05/21 17:07
题目链接:http://uva.onlinejudge.org/external/126/12676.pdf
题型:数据结构
题意:
话说这题目可真长,读了两三遍不知道啥意思。。。
关于字符串转换为哈夫曼树的,题意太绕,我说不明白了,,,,
分析:
直接上分析,采用优先队列,按照先层数后权值的二级排序,当前层的叶子节点的值取下一层的节点中的最大值,推到最后就可以得出答案。
注意用long long,这里被坑了一下。。。
代码:
#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<queue>#include<vector>#define LL long longusing namespace std;int n;struct Node{ int id; LL value; friend bool operator < (Node A,Node B){ if(A.id == B.id){ return A.value < B.value; } return A.id < B.id; }}a[60];LL MAXN[60];priority_queue<Node> q;int main(){ while(~scanf("%d",&n)){ while(!q.empty()) q.pop(); int MAX = -1; for(int i=0;i<n;i++){ scanf("%d",&a[i].id); a[i].value = -1; q.push(a[i]); MAX = max(MAX,a[i].id); } memset(MAXN,0,sizeof(MAXN)); MAXN[MAX] = 1; LL sum = 0; while(!q.empty()){ // printf("%d===>%d\n",q.top().id,q.top().value); Node s1,s2; s1 = q.top(); q.pop(); if(q.empty()){ sum = s1.value; break; } s2 = q.top(); q.pop(); if(s1.id == MAX && s2.id == MAX){ s1.value = 1; s2.value = 1; } else{ if(s1.value == -1){ s1.value = MAXN[s1.id+1]; } if(s2.value == -1){ s2.value = MAXN[s2.id+1]; } } Node ts; ts.id = s1.id - 1; ts.value = s1.value + s2.value; q.push(ts); MAXN[ts.id] = max(MAXN[ts.id],ts.value); } printf("%lld\n",sum); } return 0;}/*21 142 2 2 2108 2 4 7 5 1 6 9 3 9*/
0 0
- UVA_12676_Inverting Huffman(哈夫曼树)
- 哈夫曼树(huffman)
- Huffman编码(Huffman树)
- HackerRank Huffman Decoding(Huffman解码)
- 哈夫曼树 Huffman tree 原理
- 哈夫曼树(Huffman Tree) 实现
- 哈夫曼(Huffman )编码
- Huffman 编码 (贪心)
- 创建Huffman(数据结构)
- HUD1053 Entropy(Huffman)
- 哈夫曼编码(Huffman)
- Huffman(霍夫曼)编码
- Huffman
- Huffman
- huffman
- huffman
- Huffman
- Huffman
- .net文本编辑器的实现
- const归纳详解
- 10_leetcode_Valid Parentheses
- SqlHelper——只因为在人群中多看了你一眼
- 绩效管理
- UVA_12676_Inverting Huffman(哈夫曼树)
- 多表关联的delete和update语句语法
- SWTBOK测试实践系列(5) -- 项目中使用手动和自动化的策略
- JAVA中extends与implements详解
- 设计模式--创建型模式
- C语言 inf和nan
- oracle中的初始化参数文件
- Android多线程研究(6)——多线程之间数据隔离
- RadioButton的setTextColor失效!