贪心思想,每次选择其中最小的两个合并来减少代价。将原始数据变为负数使用优先队列进行处理:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int main(){
priority_queue<int>s;
long long sum=0;
int n,x;
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
s.push(-x);
}
while(1){
int a,b;
a=s.top();
s.pop();
b=s.top();
s.pop();
sum+=(-a-b);
if(s.empty())break;
s.push(a+b);
}
cout<<sum;
return 0;
}