每次选和最小的两堆合并就好。在被之前的一道堆优化贪心的比赛题蹂躏之后感觉有经验了,之前看过这题都没啥思路的。
#include<cstdio>
#include<queue>
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
priority_queue<int,vector<int>,greater<int> >q;
int n,a;
scanf("%d",&n);
_rep(i,1,n)
{
scanf("%d",&a);
q.push(a);
}
int ans=0;
for(;;)
{
int tmp=q.top();
q.pop();
if(q.empty())
{
printf("%d\n",ans);
return 0;
}
int tmp2=q.top();q.pop();
tmp=tmp+tmp2;
ans+=tmp;
q.push(tmp);
}
}