P1090 合并果子 / [USACO06NOV]Fence Repair G
https://www.luogu.com.cn/problem/P1090
题目意思:
- 若干堆果子,如何移动让自己最轻松。
- 两堆合为1堆。消耗体力为两堆数量之和。z
- 最终需要合为一堆。
思想——类似霍夫曼树
- 排序。每次用最小和次小的数相加。取代这两数,排序。
- s不断累加。
//P1090 合并果子 / [USACO06NOV]Fence Repair G
// Created by majoe on 2020/5/1.
//https://www.luogu.com.cn/problem/P1090
#include <bits/stdc++.h>
using namespace std;
//一共n堆,s是消耗的体力
int n,s,a[10010],temp;
//优先队列,小顶堆
priority_queue< int , vector< int > , greater<int> > q;
int main(){
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
q.push(a[i]);
}
//要进行n-1次操作,讲两个小的数弹出相加,并且压入堆中
for (int i = 0; i < n - 1; ++i) {
temp = q.top();
q.pop();
temp += q.top();
q.pop();
s+=temp;
q.push(temp);
}
cout << s;
return 0;
}