样例能过,但……
代码:
#include<iostream>
#include<queue>
#define int long long//个人习惯,龙龙于万物之中
#define re register//听说用局部变量用register会快一点
using namespace std;
int n,ans;
priority_queue<int,vector<int>,greater<int> > q;//一个小根堆
signed main(){
// freopen("P1090_2.in","r",stdin);
cin>>n;
for(re int i = 0;i < n;i ++){
re int tmp;//用一个局部变量tmp存数目,省空间
cin>>tmp;
q.push(tmp);
}
while(q.size() > 1){
int a = q.top();//取堆顶
q.pop();//删除堆顶
int b = q.top();//取新堆顶,a、b分别代表堆中的第1、2个元素,即最小的两个数
q.pop();
//这是一种贪心策略,先合并数目小的果子种类
q.push(a + b);//已经合并完了,把结果扔进堆里进行下一轮合并
ans += q.top();//记录答案
}
cout<<ans;
return 0;
}