zoukankan      html  css  js  c++  java
  • Poj(1521),哈夫曼编码

    题目链接:http://poj.org/problem?id=1521

    这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客都没有解释sum+=a+b;这个的原因。也许是我太菜了吧,脑子转不过来,好久才想通。

    比如说B,C,D出现2次,BC组成一个新的节点,4+2=6,组成一个新的节点6,6+A就是结果。

    原因是:

    sum+=2+2;

    sum+=4+2;

    sum+=6+5;

    理由是,B,C分别编码是3位,这里依次加到了sum里面,位数就是2*3;

    代码都差不多,主要是这两种的转换。

    #include <stdio.h>
    #include <queue>
    #include <string.h>
    
    using namespace std;
    
    char str[1000];
    int num[1000];
    
    int main()
    {
    
        while(scanf("%s",str))
        {
    
            memset(num,0,sizeof(num));
            if(!strcmp(str,"END"))
                break;
    
            int len = strlen(str);
    
            for(int i=0;i<len;i++)
                num[str[i]]++;
    
            priority_queue<int,vector<int>,greater<int> > Q;
    
            for(int i=0;i<1000;i++)
            {
                if(num[i])
                    Q.push(num[i]);
            }
    
            int sum = 0;
            while(Q.size()>1)
            {
                int a,b;
                a=Q.top();
                Q.pop();
                b=Q.top();
                Q.pop();
                sum+=a+b;
                Q.push(a+b);
            }
            if(sum==0)
                sum =len;
            printf("%d %d %.1f
    ",len*8,sum,double(8*len)/sum);
    
        }
        return 0;
    }
  • 相关阅读:
    7-36 复数四则运算
    7-35 有理数均值
    7-34 通讯录的录入与显示
    7-33 有理数加法
    7-32 说反话-加强版
    POJ-2524-Ubiquitous Religions
    POJ-2406-Power Strings
    HDU-1072-Nightmares
    POJ-1961-Period(ZOJ-2177)
    POJ-1961-Period(ZOJ-2177)
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5716549.html
Copyright © 2011-2022 走看看