HDU 1053

求哈夫曼编码后最小内存

就是个哈夫曼编码原理


取最小的两个值合并在一起
深度就是被合并了几次
所以直接把每次合并结果加到答案里
这样 n 次合并就表示 n 的树深,该位置的量就被累计加了 n 次, 即 子节点权值*n

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 char s[10000];
 7 int c[28];
 8 bool cmp(int a,int b)
 9 {
10     return a>b;
11 }
12 int main()
13 {
14     while(~scanf("%s",s),strcmp(s,"END"))
15     {
16         memset(c,0,sizeof(c));
17         int m=strlen(s);
18         for(int i=0;i<m;i++)
19         {
20             if(s[i]=='_') c[0]++;
21             else c[s[i]-'A'+1]++;
22         }
23         sort(c,c+27,cmp);
24         int n=0;
25         while(c[n]) n++;//取前面有效点集 
26         int ans=0;
27         for(int i=n-1;i>0;i--)
28         {
29             c[i-1]+=c[i]; //合并 
30             ans+=c[i-1];
31             sort(c,c+i,cmp);//更新点集 
32         }
33         if(n==1) ans=c[0];
34         printf("%d %d %.1lf
",8*m,ans,8.0*m/ans);
35     }
36 }
我自倾杯,君且随意
原文地址:https://www.cnblogs.com/nicetomeetu/p/5465280.html