霍夫曼树
输入的木板就是叶节点
每次节点放回去的顺序也要从小到大
使用优先队列 priority_queue<int , vector<int>,greater<int> >Q greater<int>要使用头文件#include"functional"
然后把 树的内节点相加就是结果
注意精度。。。这个真的是操蛋。
#include"iostream"
#include"algorithm"
#include"queue"
#include"functional"
using namespace std;
int main()
{
int n;
while(cin>>n)
{
priority_queue<int,vector<int>,greater<int> >Q; //优先队列的话自动排序了 每次把节点放回去也是排序好的
int number;
for(int i=0;i<n;i++)
{
scanf("%d",&number);
Q.push(number);
}
if(n==1||n==0)
cout<<0<<endl;
else
{
long long ans=0; //精度啊。。。
while(Q.size()!=1) //队列中只有一个数的时候就是根节点了,就是结果。
{
int a1,a2;
a1=Q.top();Q.pop();a2=Q.top();Q.pop();
ans+=a1+a2; //每次都加上一个内节点
Q.push(a1+a2); //构造 霍夫曼树的节点。
}
cout<<ans<<endl;
}
}
return 0;
}