求哈夫曼编码后最小内存
就是个哈夫曼编码原理
取最小的两个值合并在一起
深度就是被合并了几次
所以直接把每次合并结果加到答案里
这样 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 }