//踩坑: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);
}

京公网安备 11010502036488号