以前用哈夫曼树做过物品编码与光电识别的课,对哈夫曼编码自然熟悉,这道题是给你文章中字符种数,及对应频数,叫你计算哈夫曼编码后,文章还有多长。注意到最终求值为叶节点的层数乘以叶节点使用次数的求和,又由于叶节点使用次数即频数,那么在每次合并节点的时候,都给ans加上新节点的频数,即可得到最终答案:
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
int main()
{
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
int n;
long long ans = 0;
cin >> n;
priority_queue<long long,vector<long long>,greater<long long> > queue;
for (int j = 0; j < n; j++)
{
long long v;
cin >> v;
queue.push(v);
}
while (queue.size()!=1)
{
long long v;
v = queue.top();
queue.pop();
v += queue.top();
queue.pop();
ans += v;
queue.push(v);
}
cout << ans << endl;
if (i < t - 1)cout << endl;
}
}