//Huffman树的构造就不赘述了,使用优先队列每次选择队头的两个数并将其出列,相加后将结果放入队列中,直到队列为空为止. #include <iostream> #include <queue> #include <vector> #include <string> #include <iomanip> #include <algorithm> using namespace std; int main() { int i,j,k; string s; while(1)//cin遇到空格结束 { getline(cin,s); if(s=="END") break; priority_queue <int , vector <int>,greater<int> > q; sort(s.begin(),s.end()); /* 为什么要排序? 因为下面用到的字符分类统计是和下一个比较, 不相同就立马入队,若是相同的字符中间还有其他字符 会被认作是不同字符,因为q.size()表示的是字符种类 */ int cnt=0; char ch = s[0]; for(i=0;i<s.length();i++)//字符分类统计 if(s[i]==ch) cnt++; else { q.push(cnt); cnt=1;//因为执行到头了,i该自增了 ch=s[i]; } q.push(cnt);//这句原来忘了 int old_len = s.length()*8; int new_len = 0; //if(s.length()==1) // new_len = 1; if(q.size()==1)//上面的语句输入AAA时,只有一种字符,此时new_len=0 ,除数为0,竟然报wa,没报RE new_len = q.top(); while(q.size()>1) { int a = q.top(); q.pop(); int b = q.top(); q.pop(); q.push(a+b); new_len += a+b; } q.pop(); cout<<old_len<<" "<<new_len<<" "<<fixed<<setprecision(1)<<(double)old_len/new_len<<endl; //printf("%d %d %.1f\n",old_len,new_len,old_len*1.0/new_len); } return 0; }