算法竞赛进阶指南88页,二叉堆
本题要点:
1、二叉哈夫曼树,使用 priority_queue。
2、priority_queue 默认是大根堆,这里直接往 队列中加 果子重量的相反数,即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int MaxN = 10010;
int h[MaxN];
int n;
priority_queue<int> pq;
void solve()
{
int ans = 0, a1, a2;
while(pq.size() > 1)
{
a1 = pq.top(); pq.pop();
a2 = pq.top(); pq.pop();
ans -= (a1 + a2);
pq.push(a1 + a2);
}
printf("%d\n", ans);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d", &h[i]);
pq.push(-h[i]);
}
solve();
return 0;
}
/*
3
1 2 9
*/
/*
15
*/