poj 1521

要点:哈夫曼编码  求最后编码完成之后编码的长度

解决方法: 即为所有度为2的节点的权重的和。。避免了一次次的相加

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<cstring>
 6 #include<vector>
 7 using namespace std;
 8 int main(){
 9     char  str[1000];
10     while(cin>>str){
11         if(!strcmp(str,"END"))
12             break;
13         int num[27];
14         memset(num,0,sizeof(num));
15         int len = strlen(str);
16         for(int i=0;i<len;i++){
17             if(str[i]=='_')
18                 num[26]++;
19             else
20                 num[str[i]-'A']++;
21         }
22         priority_queue<int,vector<int >,greater<int > > q ;
23         for(int i=0;i<27;i++)
24             if(num[i]){
25                // cout<<num[i]<<endl;
26                 q.push(num[i]);
27             }
28         //cout<<q.top()<<endl;
29         int ssum = len*8;
30         int sum=0;
31         if(q.size()==1) sum = q.top();
32         while(1){
33             int a ,b;
34             a = q.top();
35             q.pop();
36             if(q.empty())
37                 break;
38             b = q.top();
39             q.pop();
40             sum += a+b;//编码的长度,正好等于所有度为2的节点的和
41             q.push(a+b);
42         }
43         printf("%d %d %.1lf \n",ssum,sum,ssum*1.0/sum);
44     }
45     return 0;
46 }

 

posted @ 2013-08-04 14:00  夜晓楼  阅读(278)  评论(0编辑  收藏  举报