题意:有一个农夫要把一个木板钜成几块给定长度的小木板,每一次费用就是当前锯的这个木板的长度 给定小木板的个数n,各个要求的小木板的长度,,求最小费用
题解:
要费用最小,即每次锯成的两块木板的长度最小(这样他们的和就最小)
用优先队列,比较方便
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{ int n,a[20003],i,m1,m2;
long long int sum;
cin>>n;
sum=0;
priority_queue< int ,vector<int>,greater<int> > que;//优先搜素树
while(!que.empty()) que.pop();
for(i=0;i<n;i++)
{ scanf("%d",&a[i]);
que.push(a[i]);
}
while(que.size()>1)//哈夫曼树
{
m1=que.top();que.pop();
m2=que.top();que.pop();
sum+=(m1+m2);
que.push(m1+m2);
}
cout<<sum<<endl;
return 0;
}