优先队列(建堆)方法,哈夫曼树即最优二叉树(在离散数学中有讲到)
#include<bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> >p;
int n,i,a,b,c,d,sum=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
p.push(a);//将每一个数入队列
}
while(!p.empty())
{
b = p.top();//取第一个数,即第一堆果子
p.pop();//出队列
if(!p.empty())
{
c = p.top();//取第二堆果子
p.pop();//出队列
d = b+c;//合并将第一堆和第二堆果子消耗体力
p.push(d);//把合并的当做一堆入队列,注意每次添加新的值后优先队列都会重新排序
sum+=d;
}
}
cout<<sum<<endl;
return 0;
}