Huffman树
1. 问题
n
堆石子,每次合并的代价为两堆石子数目之和,问 n
堆石子合并成一堆石头总的代价最小多少
2. 贪心步骤
step1: 把每一堆的石子数目加入优先级队列(最小堆)
step2: 每次取出最小的两堆石子 a、b
(最小堆前面的两个元素), a+b
加入总代价,
同时把 a+b
加入堆,直到堆中只有一个元素
代码模板
#include<iostream>
#include<queue>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
int n;
cin >> n;
priority_queue<int, vector<int>, greater<int>> heap;
for(int i = 0; i < n; i++){
cin >> a[i];
heap.push(a[i]);
}
int ans = 0;
while(heap.size() > 1){
int a = heap.top();
heap.pop();
int b = heap.top();
heap.pop();
ans += a + b;
heap.push(a + b);
}
cout << ans << endl;
return 0;
}