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;
}