题目链接:https://vjudge.net/problem/POJ-1521
因为哈夫曼编码中每条边为编码的一位,所以当两个节点相结合时(森林变树),总编码位数就加了两个节点的权值之和。
代码如下:
#include<cstdio>
#include<string>
#include<queue>
#include<iostream>
using namespace std;
int main(void) {
string s;
while (getline(cin, s)) {
if (s == "END")break;
priority_queue<int, vector<int>, greater<int> >pq;
sort(s.begin(), s.end());
int cnt = 1, ans = 0;
for (int i = 1; i < s.size(); i++) {
if (s[i - 1] == s[i])cnt++;
else {
pq.push(cnt); cnt = 1;
}
}
pq.push(cnt);
if (pq.size() == 1)ans = pq.top();
while (pq.size() > 1) {
int a = pq.top(); pq.pop();
int b = pq.top(); pq.pop();
pq.push(a + b);
ans += a + b;
}
printf("%d %d %.1lf\n", s.size() * 8, ans, 8.0 * s.size() / ans);
}
return 0;
}