RT
#include<cstdio>
#include<algorithm>
using namespace std;
long long heap[1000001] {};
int siz=0,now;
void swap(int &x,int &y){int t=x;x=y;y=t;}
void push(int x){//插入
heap[++siz]=x;
now=siz;
//堆底
while(now){//没到根节点
long long nxt=now>>1;//找到它的父亲
if(heap[nxt]>heap[now])swap(heap[nxt],heap[now]);//比它大就交换
else break;//比它父亲小,插入完成
now=nxt;//交换
}
return;
}
void pop(void){
swap(heap[1],heap[siz]);
siz--;
int now=1;
while((now<<1)<=siz){
int nxt=now<<1;//找左儿子
if(nxt+1<=siz&&heap[nxt+1]<heap[nxt])nxt++;//如果有右儿子并且右儿子比较小
if(heap[nxt]<heap[now])swap(heap[now],heap[nxt]);//就换
else break;//否则完成了
now=nxt;//没完成,继续换
}
}
long long front(){
return heap[1];
}
int main(){
int n,tmp;
long long ans;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&tmp);
push(tmp);
}
while(siz!=1){
int t1=front(),t2;
pop();
t2=front();
pop();
ans+=t1+t2;
push(t1+t2);
}
printf("%lld\n",ans);
return 0;
}