博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fence Repair(修理栅栏 POJ 3253 普通方法和优先队列解决法)
阅读量:3951 次
发布时间:2019-05-24

本文共 1780 字,大约阅读时间需要 5 分钟。

题述

农夫约翰为了修理栅栏,要将一块很长的模板切割成N块。准备切成的模板的长度为L1、L2、L3、…、LN,未切割前木板的长度恰好为切割后木板长度的总和。每次切断木板时,需要的开销为这块木板的长度。例如长度为21的木板要切成长度为5、8、8的三块木板。长度为21的木板切成长为13和8的板时,开销为21.再将长度为13的木板切成长度为5和8的板时,开销是13.于是合计开销为34.请求出按照目标要求将木板切割完最小的开销是多少?
限制条件
1<=N<=20000
0<=Li<=50000
题记
这样的切割方法其实类似于二叉树
在这里插入图片描述
这里的每一个叶子结点就对应了切割出的一块块木板。叶子结点的深度就对应了为了得到对应木板所需的切割次数,开销的合计就是各叶子的结点木板长度*结点的深度的总和。这道题其实就是最优二叉树(赫夫曼树)的变形。每次选出权重最小的两个结点,权重相加作为新的结点,以此类推构造出来的二叉树就是最优树。
遇到的问题
最后合并的时候,原来的最小和次小结点(min1和min2)已经没用了,我们需要把新的结点(两个木板的长度)加进去,我们采用从后往前缩小,我们假定让L[min1]存储新结点,L[min2]存储最后一个节点L[N-1],这里有各种特殊情况:万一min2的值等于N-1,那么这个结点就被我们自动隐藏了,所以需要把min1和min2换一下,这样万一min2等于N-1呢?其实正好,因为min2指向的结点是之后用不上的,所以L[N-1]被隐藏掉也没事。
朴素的方法代码如下

#include 
//修理栅栏using namespace std;const int Maxn=20005;typedef long long ll;//输入int N,L[Maxn];void solve(){
ll ans=0; while(N>1){
//求出最短的板min1和次短板min2 int min1=0,min2=1; if(L[min1]>L[min2]) swap(min1,min2); for(int i=2;i

使用优先队列解决

优先队列知识补充
priority_queue< Type,Container,Functional>
Type就是数据的类型,Container就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等不能用list,STL默认用vector),Functional就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本类型时,只需要第一个就行了

//升序队列priority_queue
,greater
> que_greater;//降序队列priority_queue
,less
> que_less;

具体代码如下

#include 
#include
//栅栏修补队列解决方法using namespace std;typedef long long ll;const int Maxn=20005;//输入int N,L[Maxn];void solve(){
ll ans=0; //升序队列 priority_queue
,greater
> que; for(int i=0;i
1){ //取出最短的木板和次短的木板 int min1,min2; min1=que.top(); que.pop(); min2=que.top(); que.pop(); //把两个木板合并加到原来的队列里 ans+=min1+min2; que.push(min1+min2); } printf("%lld\n",ans);}int main(){ scanf("%d",&N); for(int i=0;i

转载地址:http://gyzzi.baihongyu.com/

你可能感兴趣的文章
白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟
查看>>
中国癌症大数据出来了!每年126万例癌症死亡本可避免
查看>>
超全的 Linux 机器的渗透测试命令备忘表,共16表128条命令
查看>>
代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton
查看>>
教你用Java来玩答题(百万英雄/冲刺大会等)
查看>>
用Python做跳一跳外挂太浪费了,这种技能让你目瞪口呆
查看>>
如何在Python中快速进行语料库搜索:近似最近邻算法
查看>>
比特币这么火热,看看这篇比特币初学者指南
查看>>
快收藏! 30 分钟包你学会 AWK
查看>>
各平台的推荐算法,太贴切了!
查看>>
一张图学会Python3
查看>>
500款各领域机器学习数据集,总有一个是你要找的
查看>>
2017年终奖调查出炉 程序员年终奖多少你绝对猜不到
查看>>
写给大数据开发初学者的话 | 附教程
查看>>
分享 :17款工具,让你的数据更美观
查看>>
不必再费心寻找,2017最全的开发干货就在这1067页PDF里
查看>>
养蛙火爆,大数据解读《旅行青蛙》崛起之谜
查看>>
县级城市消费力排行榜,你的家乡排第几?
查看>>
红包外挂史及AccessibilityService分析与防御
查看>>
Python破解验证码,只要15分钟就够了!
查看>>