#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));
  }
}