UVALive - 2088 Entropy
2013-09-07 10:50
232 查看
题意:求哈夫曼编码,要求输出三个数,第一个是当字符字节是8的时候的字节总数,以及最少的,也就是经过哈夫曼编码之后的总字节数,最后是比值,采用优先队列,每次将频率最小的合并
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int MAXN = 5005; struct Node{ int l; int r; int s; friend bool operator <(const Node &a,const Node &b){ return a.s > b.s; } }arr[MAXN]; int vis[MAXN],len,sum; char str[MAXN]; priority_queue<Node> Q; void dfs(Node a,int deep){ if (a.l == -1 && a.r == -1){ sum += deep * a.s; return; } if (a.l != -1) dfs(arr[a.l],deep+1); if (a.r != -1) dfs(arr[a.r],deep+1); } void solve(){ Node temp; for (int i = 0; i < 27; i++) if (vis[i]){ temp.s = vis[i]; temp.l = temp.r = -1; Q.push(temp); } int cur = 0; while (1){ arr[cur++] = Q.top(); Q.pop(); if (Q.empty()) break; arr[cur++] = Q.top(); Q.pop(); temp.s = arr[cur-1].s + arr[cur-2].s; temp.l = cur - 1,temp.r = cur - 2; Q.push(temp); } if (cur == 1) sum = arr[cur - 1].s; else dfs(arr[cur-1],0); } int main(){ while (scanf("%s",str) != EOF){ if (!strcmp(str,"END")) break; memset(arr,0,sizeof(arr)); memset(vis,0,sizeof(vis)); len = strlen(str); sum = 0; for (int i = 0; i < len; i++) if (str[i] == '_') vis[26]++; else vis[str[i] - 'A']++; solve(); printf("%d %d %.1lf\n",len*8,sum,len*8.0/sum); } return 0; }
相关文章推荐
- uvalive 2088 - Entropy(huffman编码)
- uvalive 2088 - Entropy(huffman编码)
- Huffman编码的不建树做法 UVALive 2088 Entropy
- uvalive 2088(哈夫曼树)
- UVALIVE 2088 Entropy Huffman
- uvalive2088
- [UVALive3026] Period && 字符串
- UVALive7045 Last Defence(GCD思想)
- UVAlive3415 Guardian of Decency(最大独立集)
- UVALive 4043 Ants(二分图最佳完美匹配、KM)
- UVALive4922_Queen Collision
- 等价性证明(uvalive 4287)
- UVALive 7511 Multiplication Table (数学模拟题)
- UVAlive 7366 Brocard(二分+计算几何)
- uvalive5721 Activation(概率dp)
- UVALive 4863 Balloons 贪心/费用流
- UVALive 5790 Ball Stacking DP
- UVAlive 6693 Flow Game(模拟)
- UVALive-7279 - Sheldon Numbers(暴力大法)
- UVALive 6459 Infinite Go (模拟,搜索)