#include<bits/stdc++.h>
using namespace std;
int main(){
int n,x;
long long sum=0;
vector<int>a;
cin>>n;for(int i=0;i<n;i++)
cin>>x,a.push_back(x);sort(a.begin(),a.end());while(a.size()>1){
int s=0;
s+=a[0];
a.erase(a.begin());
s+=a[0];
a.erase(a.begin());
sum+=s;
a.insert(lower_bound(a.begin(),a.end(),s),s);}
cout<<sum;return0;}
AC priority_queue优先队列
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,x;
long long sum=0;
priority_queue<int,vector<int>,greater<int>>q;//小根堆//greater<int>:小根堆//less<int>:大根堆
cin>>n;for(int i=0;i<n;i++)
cin>>x,q.push(x);while(q.size()>1){
int s=0;
s+=q.top();
q.pop();
s+=q.top();
q.pop();
sum+=s;
q.push(s);}
cout<<sum;return0;}
@P1090 NOIP2004 提高组 合并果子 菜鸟生成记(61)n堆糖果合为一堆,代价最小(哈夫曼树构造)n<=10000;数据不是很大,可以用vector< int >动态保持数组升序或降序,模拟优先队列;数据再大一些vector就很容易超时->堆石子AC vector#include<bits/stdc++.h>using namespace std;int main(){ int n,x; long long sum=0; vec