#include<bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
int n,a[20001],x,xx,ans;
queue<int>q1;
queue<int>q2;
int main(){
scanf("%d",&n);
if(n==1){
cout<<"0";
return 0;
}
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[x]++;
}
for(int i=1;i<=20000;i++)
while(a[i]--)q1.push(i);
while(!q1.empty()||q2.size()>1){
if((q1.empty()?inf:q1.front())<=(q2.empty()?inf:q2.front())){xx=q1.front();q1.pop();}
else{xx=q2.front();q2.pop();}
if((q1.empty()?inf:q1.front())<=(q2.empty()?inf:q2.front())){xx+=q1.front();q1.pop();}
else{xx+=q2.front();q2.pop();}
q2.push(xx);
ans+=xx;
}
printf("%d",ans);
return 0;
}
可以证明处于while循环时q1.size()+q2.size()>=2
思路见https://www.luogu.com.cn/article/i4jbtufk