BUPT复试专题—哈夫曼编码(2009)
题目描述
哈夫曼编码中 平均码长=码长×码字出现的概率
如:ABCDE 五个字符的出现次数分别为50 20 5 10 15
那么,其哈夫曼编码为A:0 B:10 C:1110 D:1111 E:110
该哈夫曼编码的平均码长=(50*1+20*2+5*4+10*4+15*3)/100=1.95
输入
有多组输入,每组两行
第一行:字符的个数 N
第二行:N 个以空格隔开的数,表示这 N 个字符中每个字符出现次数
输出
输出该哈夫曼编码的平均码长,保留两位小数
样例输入
5
50 20 5 10 15
样例输出
1.95
来源
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; int a[30]; char s[1005]; struct node { int w; friend bool operator <(node aa, node bb) //<为从大到小排列,>为从小到大排列 { return aa.w > bb.w; } }; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(a, 0, sizeof(a)); int num=0,len=n; for(int i=1;i<=n;i++) //题目已知每一种字母有多少个,没已知要自己数 cin>>a[i]; priority_queue <node> q; for(int i=1;i<27;i++) { num+=a[i]; node b; b.w=a[i]; if(a[i]) q.push(b); } int res; if(q.size() == 1) res = len; else { res = 0; while(q.size() > 1) { int aa = q.top().w; q.pop(); int bb = q.top().w; q.pop(); res += (aa + bb); node b; b.w = aa + bb; q.push(b); } } double temp=double(res)/(double)num; printf("%.2lf\n",temp); } return 0; }