zoj1117 - Entropy(贪心)

来源:互联网 发布:浙江大学软件学院邮编 编辑:程序博客网 时间:2024/06/07 10:01

哈夫曼编码,

利用STL中的优先队列使得代码较为简单,

代码如下:

#include <cstdio>#include <queue>#include <cstring>using namespace std;#define M 256struct node{    int w;    bool operator < (const node &a)const{        return w>a.w;    }};node temp;int ans, c[M];priority_queue<node>q;int main (){    char str[500];    while(scanf("%s", str))    {        if(!strcmp(str,"END")) break;        int len = strlen(str);        for(int i = 0; i < len; i++)            c[str[i]]++;        for(int i = 0; i < M; i++) if(c[i])        {            temp.w = c[i];            q.push(temp);            c[i] = 0;        }        ans = 0;        while(q.size()>1)        {            int a = q.top().w; q.pop();            int b = q.top().w; q.pop();            temp.w = a+b;            ans+=temp.w;            q.push(temp);        }        if(ans==0) ans = len;//特判字符串的长度为1的情况        printf("%d %d %.1lf\n",8*len, ans, 8.0*len/ans);        while(!q.empty())   q.pop();    }    return 0;}


 

原创粉丝点击