#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <queue> // 小根堆 头文件
using namespace std;
int main(){
// 默认大根堆
priority_queue<int> pqueue; // 存储权值的相反数(使用再相反数)得到小根堆
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
int leaf;
scanf("%d",&leaf);
// pqueue.push(-leaf);
pqueue.push(-1*leaf); // 存储权值相反数
}
int wpl = 0;
// 2个结点以上才合并结点求wpl
while (pqueue.size() >= 2) {
int leaf1 = pqueue.top();
pqueue.pop();
int leaf2 = pqueue.top();
pqueue.pop();
wpl += leaf1 + leaf2; // 最后统一取相反
pqueue.push(leaf1 + leaf2); // 合并结点重新压回队列
}
printf("%d\n",-1*wpl); // 取反即为wpl
return 0;
}