优先队列,每次选取两个小的元素求和加入到队列中,当队列还剩下一个元素的时候,跳出即可,还有就是sum要定义成longlong
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> >q;
int i;
int n;
scanf("%d", &n);
int x;
for(i = 0;i < n;i++){
scanf("%d", &x);
q.push(x);
}
long long sum = 0;
int x1, x2;
while(q.size()>1){
x1 = q.top();
q.pop();
x2 = q.top();
q.pop();
q.push(x1+x2);
sum += x1+x2;
}
printf("%lld\n", sum);
return 0;
}