#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tnode {
int value;
struct Tnode* lchild;
struct Tnode* rchild;
} Tnode;
void bubblesort(Tnode* a, int len) { //冒泡排序
for (int i = len; i > 1; i--) {
for (int j = 0; j < i - 1; j++) {
if (a[j].value < a[j + 1].value) {
Tnode temp;
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
}
}
int count(Tnode* a, int weight) { //递归求带权长度和
if (a->lchild == NULL) {
return weight * (a->value);
}
weight ++;
int sum = count(a->lchild, weight) + count(a->rchild, weight);
return sum;
}
int main() {
int n;
while (scanf("%d\n", &n) != EOF) {
Tnode a[n];
for (int i = 0; i < n; i++) {
a[i].lchild = a[i].rchild = NULL;
scanf("%d", &a[i].value);
}
while (n > 1) {
bubblesort(a, n);
Tnode* x = (Tnode*)calloc(1, sizeof(Tnode));
x->value = a[n - 1].value + a[n - 2].value;
Tnode* l = (Tnode*)calloc(1, sizeof(Tnode));
Tnode* r = (Tnode*)calloc(1, sizeof(Tnode));
l->value = a[n - 1].value;
l->lchild = a[n - 1].lchild;
l->rchild = a[n - 1].rchild;
r->value = a[n - 2].value;
r->lchild = a[n - 2].lchild;
r->rchild = a[n - 2].rchild;
x->lchild = l;
x->rchild = r;
a[n - 2] = *x;
n--;
}
// int sum=count(a,0);
printf("%d", count(a, 0));
}
}