题解:用优先队列每次取最小的两个合并,记录一下。最后就是答案了。注意要用longlong
(小白的代码好长。我觉得我的代码更简练)
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
priority_queue<ll,vector<ll>,greater<ll> > q;
int main()
{
int t;
while (~scanf("%d",&t))
{
while (t--)
{
ll a;
scanf("%lld",&a);
q.push(a);
}
ll ans = 0;
while (!q.empty())
{
ll a = q.top();q.pop();
ll b = q.top();q.pop();
ans += (a + b);
if(q.empty())
break;
q.push(a + b);
}
printf("%lld\n",ans);
}
}