//踩坑:1.leaf1,2 pop读取,应该先top再pop //踩坑:2.迭代中,忘了将1,2放入priority中! #include <cstdio> #include<queue> using namespace std; int main() { int n; scanf("%d",&n); priority_queue<int>quq; //小根堆,用相反数 for(int i = 0; i<n; i++){ //小根堆建立 int leaf; scanf("%d",&leaf); quq.push(-leaf); } int res=0; //迭代结果:每次左子树都是累加的,右子树其实就加一个右结点。 while(quq.size()>1){ int leaf1,leaf2; leaf1=quq.top(); quq.pop(); leaf2=quq.top(); quq.pop(); quq.push(leaf1+leaf2); res=res+leaf1+leaf2; } printf("%d\n",-res); }