#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 10, inf = 0x3f3f3f3f;
// 优先队列(最小堆),用于存储叶结点的权值
priority_queue<int, vector<int>, greater<int>> q;
int n, ans, x;
int main() {
// 读取叶结点的数量
cin >> n;
// 读取每个叶结点的权值,并将其放入优先队列
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
q.push(x);
}
// 构建哈夫曼树
while (q.size() > 1) {
// 取出两个最小的权值
int a = q.top(); q.pop();
int b = q.top(); q.pop();
// 累加这两个权值之和到带权路径长度
ans += a + b;
// 将合并后的权值重新放入优先队列
q.push(a + b);
}
// 输出最终的带权路径长度
cout << ans;
return 0;
}