题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053
题意是,给出一排字符串,要求求出字符的8位编码的长度,哈夫曼编码值,以及之间的比值
因为仅仅只要求求出哈夫曼编码值,所以不用建立哈夫曼树,可以建立优先队列,只要将每次最小的
出队的两个元素合成一个新的大数,然后放进优先队列中,直到只剩下一个元素为止,那个元素就是哈夫曼编码值。
注意只有一种字符的情况
ac代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int main(){
int a[30];
string s;
while(cin>>s){
memset(a,0,sizeof(a));
if(s=="END")//结束标志
break;
int l=s.length();
for(int i=0;i<l;i++){
if(s[i]=='_')
a[26]++;
else
a[s[i]-'A']++;
}
priority_queue<int,vector<int>,greater<int> >q;
for(int i=0;i<=26;i++){
if(a[i])
q.push(a[i]);
}
int sum=0;
while(q.size()>1){
int x=q.top();q.pop();
int y=q.top();q.pop();
q.push(x+y);
sum+=(x+y);
}
if(sum==0){
sum=l;
}
printf("%d %d %.1lf\n",l*8,sum,(l*8.0)/(sum*1.0));
}
return 0;
}