题目大意:就是农夫钜木,费用是木板的长度,求最小费用。怎么联想到是哈夫曼树模型呢?关键字:顺序不同,则费用不同,哈夫曼树的特点就是:给定n个叶子节点,可以使得带权路径长度最小。对于本题,怎样使得每块木板在最短的榉木次数下就可以锯出来(关键字:每块木板),这样就是费用最小的情况,那肯定是先钜大块的木,再从大块的木中钜小块。把一个分支看成钜一次木,所以钜一次木就是一个单位长度路径,哈夫曼树的模型就出来了。当然本题中非叶子节点的权值和就是最小费用。
注意的是:题目的过程中的数较大。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n;
__int64 tmp;
cin>>n;
priority_queue<__int64,vector<__int64 >,greater<__int64 > >q;
for(int i=0;i<n;i++ )
{
cin>>tmp;
q.push(tmp);
}
__int64 a,b;
__int64 sum=0;
for(int i=0;i<n-1;i++)
{
a=q.top();
q.pop();
b=q.top();
q.pop();
q.push(a+b);
sum+=(a+b);
}
cout<<sum<<endl;
system("pause");
return 0;}