FarmCraft
题意:mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子。mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为ci。树上的每条边mhy能且仅能走两次,每次耗费1单位时间。mhy送完所有电脑后会回自己家里然后开始装zhx牌杀毒软件。卸货和装电脑是不需要时间的。求所有妹子和mhy都装好zhx牌杀毒软件的最短时间。
分析:不难想到使用树形dp,因为最短时间显然由最后安装完电脑的妹子决定,所以dp[i]表示i所有子树中最后安装完电脑的妹子所需的最短时间,那么如何规定访问的顺序呢?考虑如果该节点所有的儿子均为叶子节点,那么对于x任意两个子节点y,z,显然dp[x]是先走y与先走z中决策的最小值,即dp[x]=min(max(cy+1,cz+3),max(cy+3,cz+1))若cy>cz,则dp[x]=min(max(cy+1,cz+3),cy+3)因为cy+3显然是这几项里的最大值,所以dp[x]=max(cy+1,cz+3)所以也就说明了要先走y再走z顺序,也就是将所有儿子从大到小排序并从最大的开始按照顺序选择,那么推广到一般情况呢,还是对于任意x的任意两个子节点y,z,dp[x]当然也是先走y与先走z中决策的最小值,如果先走y再走z,那么首先你要花1的时间从x到达y,然后再讲y点看成一个修电脑时间为dp[y]的妹子,那么总时间就是dp[y]+1,然后再走z,这个时候根据题目要求你应该已经走完了y子树中所有的节点,而因为只有走边需要花费时间,所以子节点(包括本身)为num[y]个的y子树应该有num[y]-1条边,再加上从x到y的那一条边就一共有num[y]条边,而这些边每条边需要走两遍,最后再回到x节点,所以总花费就是num[y]*2的时间,然后再从x走到z最终是花费dp[z]+num[y]*2+1的时间,而该种走法的最终时间就是max(dp[y]+1,dp[z]+num[y]*2+1),而另一种走法也同理,最终时间是max(dp[z]+1,dp[y]+num[z]*2+1),dp[x]也就等于这两种走法中的最小值,观察这两个式子dp[z]+num[y]*2+1一定是比dp[z]+1大的,如果dp[z]+num[y]*2+1还比dp[y]+num[z]*2+1大的话显然就一定选择第二种,也就是说dp[z]+num[y]*2+1与dp[y]+num[z]*2+1这两项的大小关系直接影响到我们选择的顺序,而且如果dp[z]+num[y]*2+1>dp[y]+num[z]*2+1的话就选第二种(先走z),否则就选第一种(先走y),稍微化简一下就能得到如果dp[z]-num[z]*2]>dp[y]-num[y]*2的话就先走z,否则先走y,所以要讲x的子节点按照dp[i]-num[i]*2排序,再从大到小选择
最后的走法就是到达这个点之后先让他把这个点的电脑修一下,毕竟不修白不修,然后开始按照上述选择子节点的顺序选择子节点,该点的dp[x]值就是该种走法下每个子节点所需时间与cx的最大值,要注意的是这里的每个子节点所需时间与dp[i]不同,这个地方表示的所需时间是包括了之前走别的地方所花费的时间,具体来说如果这个节点是最后走的,那他应该加上前面所有需要走的边数*2+1(+1为x到这个节点的时间。还有一个很关键的问题,区别好等待时间与实际的时间,比如可能会有个问题,x节点的最后一个子节点与x连的这条边好像返回没有被记录,实际上不需要记录这条边所产生的时间,因为dp[x]表示的是安装完电脑所需的最短时间而不是回到初始点所花费的时间,如果你在未回到起始的1号点时就已经把别的电脑都修完了,那么你所用的时间只是所有边的花费*2+c1,具体可以看看这组数据来感受一下,也就是说最终的结果其实是max(dp[1],(n-1)*2+c1) 其中n-1表示这个树的总边数。
4
1 1 1 1
1 2
2 3
3 4
代码:

FarmCraft的更多相关文章
- [补档][Poi2014]FarmCraft
[Poi2014]FarmCraft 题目 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒 ...
- FarmCraft[POI2014]
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ...
- [BZOJ 3829][POI2014] FarmCraft
先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 421 Solved: 197[ ...
- BZOJ3829[Poi2014]FarmCraft——树形DP+贪心
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ...
- 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ...
- 【bzoj3829】[Poi2014]FarmCraft 贪心
原文地址:http://www.cnblogs.com/GXZlegend/p/6826667.html 题目描述 In a village called Byteville, there are ...
- [POI2014][树形DP]FarmCraft
题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...
- FarmCraft --(树形DP)
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of hous ...
- 【树形dp】Farmcraft
题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...
- 【树形DP】BZOJ 3829 Farmcraft
题目内容 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子i. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为Ci. ...
随机推荐
- Python进度条模块tqdm实现任务进度可视化
一.前言 tqdm 是一个易用性强.扩展性高的 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息,我们只需要封装任意的迭代器 tqdm(iterator) 即可. 二.安装 ...
- Python 的while循环和for循环的使用
#循环 遍历 迭代 # while循环 a = 0while a <5: a =a+1 if a == 3: continueprint('我循环了')+str(a) # print ('我循环 ...
- 经常使用到的vim命令
常用的vim命令 总结了我经常用到的vim命令,虽然不是很全,但是日常的开发足够了 启动vim vim 直接启动vim vim filename 打开vim并创建名为filename的文件 插入命令 ...
- TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结
写在前面 我之前使用的LSTM计算单元是根据其前向传播的计算公式手动实现的,这两天想要和TensorFlow自带的tf.nn.rnn_cell.BasicLSTMCell()比较一下,看看哪个训练速度 ...
- AQS系列(七)- 终篇:AQS总结
前言 本文是对之前AQS系列文章的一个小结,首先看看以下几个问题: 1.ReentrantLock和ReentrantReadWriteLock的可重入特性是如何实现的? 2.哪个变量控制着锁是否被占 ...
- Linux学习笔记(二)文件操作命令
文件操作命令 touch stat cat more less head tail ln touch 英文原意: change file timestamps 功能: 修改文件的时间戳 语法: tou ...
- java 一维数组的总结笔记
数组 1. 一位数组的声明方式 type[] array Name 或 type arrayName[];(推荐使用第二种) 错误的声明方式 //int[5] intErrorArray;错误的 // ...
- 一个可能是世界上最全的 API 接口集合库开源项目
对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...
- 详细的JavaScript知识梳理和经典的一百个例题,让你掌握JavaScript
这里先做一下JavaScript知识点的梳理,具体的可领取资料 JavaScript语法: js语法.png DOM操作: DOM操作.png 数据类型 面向对象 继承 闭包 插件 作用域 跨域 原型 ...
- Python爬虫入门(基础实战)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...