题目大意
解题思路
- 因此我们使用贪心策略构造哈夫曼树,自底向上,每次选取当前最小的两个数构成新节点,直到只剩下一个节点。
- 使用
long long
。
代码
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
priority_queue<ll, vector<ll>, greater<ll> > PQ;
int main()
{
ll N;
ll tmp;
cin >> N;
while(N--)
{
cin >> tmp;
PQ.push(tmp);
}
ll ans = 0;
while(PQ.size() > 1)
{
ll a = PQ.top();
PQ.pop();
ll b = PQ.top();
PQ.pop();
ans += a+b;
PQ.push(a+b);
}
cout << ans << endl;
return 0;
}
知识点
- 构造以
int
为类型的小顶堆: priority_queue<int , vector<int>, greater<int> > PQ;