//哈夫曼(最优二叉树)方法 建树//非指针做法//数据如果很大的话,有可能会超时
#include <iostream>
#define maxn 10000+10000+3
using namespace std;
class T {
public:
int data,parent,left,right;
}tree[maxn];
int f[maxn] = {0};
int search (int k) {
int min1 = 99999999;
int pos;
for (int i = 0;i<k;i++) {
if (!f[i] && tree[i].data < min1) {
min1 = tree[i].data;
pos = i;
}
}
f[pos] = 1;
return pos;
}
void Huffman(int n) {
for (int k = n;k<2*n-1;k++) {
int pos1 = search (k); tree[pos1].parent = k;tree[k].left = pos1;
int pos2 = search (k); tree[pos2].parent = k;tree[k].right = pos2;
tree[k].data = tree[pos1].data + tree[pos2].data;
}
}
int main () {
int n;
cin >> n;
for (int i=0; i<n;i++) {
cin >> tree[i].data;
}
Huffman(n);
long long sum = 0;
for (int i=n;i<2*n-1;i++) {
sum += tree[i].data;
}
cout << sum << endl;
}
//哈夫曼(最有二叉树)非建树的方法//比较优化
#include <iostream>
#define maxn 10005
using namespace std;
int main () {
int n;
int ans = 0;
int a[maxn];
cin >> n;
for (int i=0;i<n;i++) {
cin >> a[i];
}
int pos1,pos2;
while (n>1) {
int min1 = 999999999;
for (int i=0;i<n;i++) {
if (a[i]<min1) {
pos1 = i;
min1 = a[i];
}
}
int min2 = 999999999;
for (int i=0;i<n;i++) {
if (a[i]<min2 && i != pos1) {
pos2 = i;
min2 = a[i];
}
}
a[pos1] = min1 + min2;
ans += a[pos1];
a[pos2] = a[n-1];
n--;
}
cout << ans << endl;
}