//使用哈夫曼树的原理,通过优先队列来实现。每次将最小的两堆合并在一起即可得到答案
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int n;
struct compare{//修改优先队列为升序排列
bool operator()(int a, int b){
return a > b;
}
};
int main(){
while(cin >> n){
priority_queue<int, vector<int>, compare> queue;
for(int i = 0; i < n; i++){
int num;
cin >> num;
queue.push(num);
}
int coast = 0;
while(queue.size() != 1){//当没有合并为一堆的时候
int num_1 = queue.top();//取出最小的两个
queue.pop();
int num_2 = queue.top();
queue.pop();
coast += (num_1 + num_2);
queue.push(num_1 + num_2);//不要忘记把和在放进队列中
}
cout << coast << endl;
}
return 0;
}
//presented by 大吉大利,今晚AC