#include <iostream>
#include <queue>
using namespace std;

// 自定义比较函数,用于优先队列(最小堆)
struct myCompare {
    bool operator()(const int& a, const int& b) {
        return a > b;
    }
};

int main() {
    int n;
    while (cin >> n) { // 处理多组数据
        priority_queue<int, vector<int>, myCompare> minHeap; // 最小堆
        int weight;
        for (int i = 0; i < n; i++) {
            cin >> weight;
            minHeap.push(weight); // 将叶节点权值插入最小堆
        }

        int totalCost = 0; // 总权值
        while (minHeap.size() > 1) {
            // 取出两个最小的权值
            int min1 = minHeap.top();
            minHeap.pop();
            int min2 = minHeap.top();
            minHeap.pop();

            // 合并两个节点,计算新节点的权值
            int sum = min1 + min2;
            totalCost += sum; // 累加到总权值
            minHeap.push(sum); // 将新节点插入最小堆
        }

        cout << totalCost << endl; // 输出结果
    }
    return 0;
}