题目描述
![](https://img-blog.csdnimg.cn/20210217094708159.png)
分析
此题不是
区间DP
(区间 D P DP DP的限制是每次只能合并相邻的两堆)
题目要求一个最小的体力耗费值, 可以采取贪心的策略: 在每次合并时都耗费最少的体力, 即选当前数目最少的两堆 ( ( (用优先队列维护一个小根堆即可 ) , ), ), 从而求出最优解
此题是一个哈夫曼树的模型. 要求的最小的体力耗费值, 其实是哈夫曼树的带权路径长度 W = W= W= 所有分支点权值之和
也可参考Y总视频讲解
实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int n, val;
long long ans;
priority_queue<int, vector<int>, greater<int> > q;
int main()
{
cin >> n;
for(int i=0; i<n; i++)
{
cin >> val;
q.push(val);
}
n--;
while(n--)
{
int x = q.top();
q.pop();
int y = q.top();
q.pop();
q.push(x + y);
ans += x + y;
}
cout << ans << endl;
return 0;
}