import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<MyNode> list = new ArrayList<>();
for(int i=1;i<=n;i++){
list.add(new MyNode((long)sc.nextInt()));
}
//生成哈夫曼树
MyNode root = createHFTree(list);
System.out.println(getSum(root));
}
public static long getSum(MyNode root){
long sum = 0;
Queue<MyNode> queue = new LinkedList<>();
root.depth = 0;
queue.add(root);
while(!queue.isEmpty()){
MyNode node = queue.poll();
if(node.left!=null){
node.left.depth = node.depth+1;
node.right.depth = node.depth+1;
queue.add(node.left);
queue.add(node.right);
}else{
sum+=node.val*node.depth;
}
}
return sum;
}
public static MyNode createHFTree(List<MyNode> list){
//创建哈夫曼树过程中,每添加一次节点,都要排序一次,就用优先队列(堆排序)
PriorityQueue<MyNode> queue = new PriorityQueue<>(Comparator.comparingLong(o -> o.val));
queue.addAll(list);
while(!queue.isEmpty()){
MyNode left = queue.poll();
MyNode right = queue.poll();
if(right == null) //堆中只有一个节点,那就是根节点
return left;
MyNode newNode = new MyNode(left.val+right.val);
newNode.left = left;
newNode.right = right;
queue.add(newNode);
}
return null;
}
}
class MyNode{
long val;
long depth;
MyNode left;
MyNode right;
public MyNode(long val){
this.val = val;
}
}