首先拿用例来说明一下题意
给个一根长度为21的模板,
目标是把它分为三块,长度分别是8,5,8
切割的时候先把他切割成长度为8和13的,消耗21,
然后再把长度为13的模板切割成长度为5和8的,消耗13
然后总消耗就是21+13=34
求最小总消耗
我用的是哈弗曼树来实现,需要注意的是输入n==1,也就是分成一块的时候,这时候直接弹出队列并输出木板长度,否则根据哈夫曼计算总消耗并输出
下面是代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
int n;
long long int sum;
priority_queue<int, vector<int>, greater<int> > p;//最小优先队列,默认是最大
while(cin>>n)
{
int x;
sum=0;
for(int i=1; i<=n; ++i)
{
cin>>x;
p.push(x);
}
if(n==1)
{
sum=p.top();
p.pop();
}
else
{
int temp1,temp2;
while(p.size()>1)
{
temp1=p.top();
p.pop();
temp2=p.top();
p.pop();
int temp;
temp=temp1+temp2;
p.push(temp);
sum+=temp;
}
p.pop();
}
cout<<sum<<endl;
}
}