BUPT复试专题—哈夫曼编码(2009)

题目描述

哈夫曼编码中  平均码长=码长×码字出现的概率

如:ABCDE 五个字符的出现次数分别为50 20 5 10 15

那么,其哈夫曼编码为A:0   B:10   C:1110   D:1111   E:110

该哈夫曼编码的平均码长=(50*1+20*2+5*4+10*4+15*3)/100=1.95

输入

有多组输入,每组两行

第一行:字符的个数 N

第二行:N 个以空格隔开的数,表示这 N 个字符中每个字符出现次数

输出

输出该哈夫曼编码的平均码长,保留两位小数

样例输入

5
50 20 5 10 15

样例输出

1.95

来源

2009机考D题 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<queue> 
using namespace std; 
int a[30];
char s[1005];
struct node
{
    int w;
    friend bool operator <(node aa, node bb) //<为从大到小排列,>为从小到大排列 
    {
        return aa.w > bb.w; 
    }
};
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(a, 0, sizeof(a));
        int num=0,len=n;
        for(int i=1;i<=n;i++) //题目已知每一种字母有多少个,没已知要自己数 
            cin>>a[i];
        priority_queue <node> q; 
        for(int i=1;i<27;i++)
        {
            num+=a[i];
            node b;
            b.w=a[i];
            if(a[i])
                q.push(b); 
        }
        int res; 
        if(q.size() == 1)
            res = len;
        else
        {
            res = 0; 
            while(q.size() > 1)
            {
                int aa = q.top().w; q.pop(); 
                int bb = q.top().w; q.pop(); 
                res += (aa + bb);
                node b;
                b.w = aa + bb;
                q.push(b);
            }
        }
        double temp=double(res)/(double)num;
        printf("%.2lf
",temp);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dzzy/p/8619510.html