題目鏈接:點擊這裏
#include<cstdio>
#include<queue>
using namespace std;
//代表小頂堆的優先隊列
priority_queue<long long, vector<long long>, greater<long long> > q;
int main()
{
int n;
long long temp, x, y, ans = 0;
scanf("%d", &n);
for(int i = 0; i < n;i++)
{
scanf("%lld", &temp);
q.push(temp); //將初始重量壓入優先隊列
}
while(q.size() > 1) //只要優先隊列中至少有兩個元素
{
x = q.top();
q.pop();
y = q.top();
q.pop();
q.push(x + y); //取出堆頂的兩個元素,求和後壓入優先隊列
ans += x+y; //累計求和的結果
}
printf("%lld\n", ans); //ans即爲消耗的最小體力
return 0;
}