您的位置:首页 > Web前端

Fence Repair POJ - 3253 最小优先队列,哈弗曼树

2017-07-15 19:18 435 查看
首先拿用例来说明一下题意

给个一根长度为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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: