当前位置: 代码迷 >> 综合 >> 洛谷 P1090 合并果子(算法竞赛进阶指南,二叉堆)
  详细解决方案

洛谷 P1090 合并果子(算法竞赛进阶指南,二叉堆)

热度:79   发布时间:2023-12-13 18:56:50.0

算法竞赛进阶指南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 */