• 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;
    }
  • 相关阅读:
    hero
    今年暑假不AC
    Who's in the Middle
    A Simple Problem with Integers
    I hate it
    敌兵布阵
    Ordering Tasks
    Points on Cycle
    食物链
    c++ 14.0下载地址
  • 原文地址:https://www.cnblogs.com/dzzy/p/8619510.html
Copyright © 2020-2023  润新知