/*本题与搬水果题异曲同工,均利用小顶堆实现*/
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue< int , vector<int> , greater<int> > min_heap;
int n=0;
int weight=0;
int res=0;
int first=0,second=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>weight;
min_heap.push(weight);
}
while(min_heap.size()!=1){
first=min_heap.top();
min_heap.pop();
second=min_heap.top();
min_heap.pop();
res+=(first+second);
min_heap.push(first+second);
}
cout<<res<<endl;
return 0;
}
关于哈夫曼树:详见王道机试P168

京公网安备 11010502036488号