题目:http://acm.hdu.edu.cn/showproblem.php?pid=1053
思路:主要是建立hunffman编码,我一开始没想通,源码是len的8倍,与Huffman编码求比值就好了。
#include<bits/stdc++.h>
using namespace std;
int num[30];
int main(void)
{
string s;
int i,tp,sum;
while(cin>>s&&s!="END")
{
int len=s.size();
memset(num,0,sizeof(num));
for(i=0;i<len;i++)
{
if(s[i]=='_') num[26]++;
else num[s[i]-'A']++;
}
priority_queue <int ,vector<int>,greater<int> >q;
for(i=0;i<=26;i++)
{
if(num[i]) q.push(num[i]);
}
sum=0;
while(q.size()>1)
{
tp=q.top();q.pop();
tp+=q.top();q.pop();
sum+=tp;
q.push(tp);
}
if(sum==0) sum=len;
printf("%d %d %.1f\n",len*8,sum,(len*8.0)/(sum*1.0));
}
return 0;
}
参考文章:https://blog.csdn.net/hurmishine/article/details/53164539