Huffman的题,基本都是用pq水过。今天我才知道,计算压缩后编码总长度,只要用加的方法就行了。
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 int main() 6 { 7 char ss[1000]; 8 int i,l,n,a,b; 9 int d[40]; 10 while(scanf("%s",ss),strcmp(ss,"END")) 11 { 12 memset(d,0,sizeof d); 13 l = strlen(ss); 14 for(i = 0; i < l; i++) 15 d[ss[i]-60]++; 16 priority_queue<int,vector<int>,greater<int> >q; 17 for(i = 0; i < 40; i++)if(d[i]) 18 q.push(d[i]); 19 n = 0; 20 if(q.size()==1) 21 { 22 a = q.top(); 23 printf("%d %d 8.0\n",8*a,a); 24 continue; 25 } 26 while(q.size()>1) 27 { 28 a = q.top(); q.pop(); 29 b = q.top(); q.pop(); 30 q.push(a+b); 31 n += a+b; 32 } 33 printf("%d %d %.1lf\n",8*l,n,8*l/double(n)); 34 } 35 return 0; 36 }