Poj(1521),哈夫曼编码
题目链接:http://poj.org/problem?id=1521
这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客都没有解释sum+=a+b;这个的原因。也许是我太菜了吧,脑子转不过来,好久才想通。
比如说B,C,D出现2次,BC组成一个新的节点,4+2=6,组成一个新的节点6,6+A就是结果。
原因是:
sum+=2+2;
sum+=4+2;
sum+=6+5;
理由是,B,C分别编码是3位,这里依次加到了sum里面,位数就是2*3;
代码都差不多,主要是这两种的转换。
#include <stdio.h> #include <queue> #include <string.h> using namespace std; char str[1000]; int num[1000]; int main() { while(scanf("%s",str)) { memset(num,0,sizeof(num)); if(!strcmp(str,"END")) break; int len = strlen(str); for(int i=0;i<len;i++) num[str[i]]++; priority_queue<int,vector<int>,greater<int> > Q; for(int i=0;i<1000;i++) { if(num[i]) Q.push(num[i]); } int sum = 0; while(Q.size()>1) { int a,b; a=Q.top(); Q.pop(); b=Q.top(); Q.pop(); sum+=a+b; Q.push(a+b); } if(sum==0) sum =len; printf("%d %d %.1f\n",len*8,sum,double(8*len)/sum); } return 0; }