杭电hdu 1053 Entropy题解

来源:互联网 发布:anyview java 编辑:程序博客网 时间:2024/05/17 20:29

http://acm.hdu.edu.cn/showproblem.php?pid=1053

这题就是运用哈夫曼的编码思想,然后统计用哈夫曼编码后的二进制长度,以及运用ascii编码长度的比较。我在这题上感觉统计无从下手,虽然知道哈夫曼的贪心实现,但真正的到运用的时候了,却一时想不起应该怎么用代码去实现,进过参考别人用优先队列写的代码,我也写出了我自己的代码。现记录在下面。做个在编程上的参考。

#include <string>#include <algorithm>using namespace std;int num[27];void init(){int i;for(i = 0; i < 27; i ++){num[i] = 0;}}int fun(){int n = 0,i,j,l;sort(num, num+27);int tmp[27],k = 0;for(i = 0; i < 27; i ++){if(num[i] != 0)break;}l = 27-i;if(l == 1)return num[26];for(i = 27-l; i < 27; i ++){tmp[k++] = num[i];//printf("tmp[%d] = %d\n", k-1, tmp[k-1]);}for(i = 0; i < l - 1; i ++){if(i%2==0){num[0] = tmp[0] + tmp[1];n+=num[0];for(j = 2; j < k; j ++){num[j-1] = tmp[j];}k--;sort(num, num+k);}else{tmp[0] = num[0]+num[1];n+=tmp[0];for(j = 2; j < k; j ++){tmp[j-1] = num[j];}k--;sort(tmp, tmp+k);}}return n;}char str[1001];int main(){int len,i;int original, now;while(scanf("%s", str)&&strcmp(str,"END")!=0){init();len = strlen(str);for(i = 0; i < len; i ++){if(str[i]-'A'<26){num[str[i]-'A'] ++;}else {num[26] ++;}}original = 8*len;now = fun();printf("%d %d %.1lf\n", original, now, 1.0*original/now);}return 0;}


原创粉丝点击