//所有中间节点的权值和为带权路径长度,这个知识点很重要。剩余的就是利用小根堆(优先队列)了
#include "stdio.h"
#include "queue"
using namespace std;
struct TreeNode{
int weight;
};
bool operator <(TreeNode lhs,TreeNode rhs){
if (lhs.weight > rhs.weight) //父节点大于孩子时交换,相当于构建小根堆
return true;
else
return false;
}
int main(){
int n;
while (scanf("%d",&n)!=EOF){
priority_queue<TreeNode> myPQueue;
for (int i = 0; i < n; ++i) {
TreeNode node;
scanf("%d",&node.weight);
myPQueue.push(node);
}
int sum = 0;
while (myPQueue.size()>1){
TreeNode node1,node2,node3;
node1 = myPQueue.top();myPQueue.pop();
node2 = myPQueue.top();myPQueue.pop();
node3.weight = node1.weight + node2.weight;
sum += node3.weight;
myPQueue.push(node3);
}
myPQueue.pop();
printf("%d\n",sum);
}
}