原题链接:
题解:
由于合并石子是有代价的,合并a和b的代价是a+b,为了使得代价最小,我们自然不想让较大的石子堆移来移去,每次都选择最小的两个石子堆进行合并无疑是最佳的策略,因此本题就是一个典型的哈夫曼问题。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, res;
priority_queue<int, vector<int>, greater<int>> p;
int main(){
cin >> n;
for (int i = 0;i < n;i++) {
int a;cin >> a;
p.push(a);
}
while (p.size() > 1) {
int a = p.top();
p.pop();
int b = p.top();
p.pop();
p.push(a + b);
res += a + b;
}
cout << res;
}