杭电hdu 1053 Entropy题解

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值