Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4171 Accepted Submission(s): 1703
1 #include <queue> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 #define MAX 100 9 struct node 10 { 11 int num; 12 int id; 13 int pid; 14 bool operator <(const struct node& x)const 15 { 16 return num>x.num; 17 } 18 }alp[MAX]; 19 priority_queue <node> q; 20 string s; 21 void out() 22 { 23 for(int i=0;i<27;i++) 24 printf("%c:num=%d id=%d pid=%d\n",i+‘A‘,alp[i].num,alp[i].id,alp[i].pid); 25 cout<<endl; 26 } 27 int getindex(char ch) 28 { 29 if(ch==‘_‘) return 26; 30 return ch-‘A‘; 31 } 32 void init() 33 { 34 while(!q.empty()) q.pop(); 35 sort(s.begin(),s.end()); 36 for(int i=0;i<27;i++) 37 { 38 alp[i].id=i; 39 alp[i].pid=i; 40 alp[i].num=0; 41 } 42 } 43 void read() 44 { 45 int len=s.length(); 46 int index; 47 int i; 48 for(i=0;i<len;i++) 49 { 50 index=getindex(s[i]); 51 ++alp[index].num; 52 } 53 for(i=0;i<27;i++) 54 if(alp[i].num) q.push(alp[i]); 55 } 56 void cal() 57 { 58 struct node temp; 59 int a,b; 60 int n=27,i; 61 int fnum=s.length()*8; 62 int snum=0,heigh=0; 63 if(q.size()==1) 64 { 65 snum=q.top().num; 66 printf("%d %d %.1f\n",fnum,snum,(double)fnum/(1.0*snum)); 67 return ; 68 } 69 while(q.size()>1) 70 { 71 a=q.top().id; 72 q.pop(); 73 b=q.top().id; 74 q.pop(); 75 alp[n].num=alp[a].num+alp[b].num; 76 alp[n].id=alp[n].pid=n; 77 alp[a].pid=alp[b].pid=n; 78 q.push(alp[n]); 79 //printf("a:num=%d id=%d pid=%d\n",a.num,a.id,a.pid); 80 //printf("b:num=%d id=%d pid=%d\n",b.num,b.id,b.pid); 81 //printf("n:num=%d id=%d pid=%d\n\n\n",alp[n].num,alp[n].id,alp[n].pid); 82 ++n; 83 } 84 //out(); 85 for(i=0;i<27;i++) 86 { 87 if(!alp[i].num) continue; 88 heigh=0; 89 temp=alp[i]; 90 while(temp.id!=temp.pid) 91 { 92 temp=alp[temp.pid]; 93 ++heigh; 94 } 95 //printf("height=%d id=%d num=%d\n",heigh,temp.id,temp.num); 96 snum=snum+heigh*alp[i].num; 97 } 98 printf("%d %d %.1f\n",fnum,snum,(double)fnum/(1.0*snum)); 99 } 100 void solve() 101 { 102 init(); 103 read(); 104 cal(); 105 } 106 107 int main() 108 { 109 while(cin>>s&&s!="END") 110 { 111 solve(); 112 } 113 return 0; 114 }
Hdu 1053 Entropy,布布扣,bubuko.com
原文:http://www.cnblogs.com/By-ruoyu/p/3905543.html