题意: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的更多相关文章

  1. [补档][Poi2014]FarmCraft

    [Poi2014]FarmCraft 题目 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒 ...

  2. FarmCraft[POI2014]

    题目描述 In a village called Byteville, there are   houses connected with N-1 roads. For each pair of ho ...

  3. [BZOJ 3829][POI2014] FarmCraft

    先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 421  Solved: 197[ ...

  4. BZOJ3829[Poi2014]FarmCraft——树形DP+贪心

    题目描述 In a village called Byteville, there are   houses connected with N-1 roads. For each pair of ho ...

  5. 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)

    [BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are   houses connected ...

  6. 【bzoj3829】[Poi2014]FarmCraft 贪心

    原文地址:http://www.cnblogs.com/GXZlegend/p/6826667.html 题目描述 In a village called Byteville, there are   ...

  7. [POI2014][树形DP]FarmCraft

    题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...

  8. FarmCraft --(树形DP)

    题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of hous ...

  9. 【树形dp】Farmcraft

    题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...

  10. 【树形DP】BZOJ 3829 Farmcraft

    题目内容 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子i. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为Ci. ...

随机推荐

  1. shell http请求&处理返回值获取其中某个字段的值

    并且第一个接口的返回值中部分参数得作为第二个接口的入参,所以做了如下shell验证 第一个接口返回的response body串: { "bizCode": "1&quo ...

  2. 使用docker-compose编写常规的lnmp容器,pdo连接mysql失败。

    问题的核心是yii2 是通过pdo的方式去连接数据的.但是我们通过容器去搭建lnmp环境时,nginx , php , mysql 这三个服务是独立的三个容器,彼此隔离.所以在yii2中连接mysql ...

  3. bootstrapTable随机改变列颜色

    { title: '运单编号', field: 'waybillNumber', align: 'center', valign: 'middle', cellStyle: function (val ...

  4. [算法总结]康托展开Cantor Expansion

    目录 一.关于康托展开 1.什么是康托展开 2.康托展开实现原理 二.具体实施 1.模板 一.关于康托展开 1.什么是康托展开 求出给定一个由1n个整数组成的任意排列在1n的全排列中的位置. 解决这样 ...

  5. 学会这项python技能,就再也不怕孩子偷偷打游戏了

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:鸟哥 PS:如果想了解更多关于python的应用,可以私信小编,资料 ...

  6. F. 蚂蚁装修

    单点时限: 2.0 sec 内存限制: 512 MB 还有一个月就开学了,爱学习的小蚂蚁想庆祝一下!于是它要把它的“家”装修一下.首先要做的就是贴地板.小蚂蚁“家”的地面可以看成一个2∗N 的方格 , ...

  7. google protobuf c++ 反射

    const Descriptor *desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name); asser ...

  8. 今天我们来谈谈绝对定位和相对定位的区别,和需要注意的问题;position:absolute|relative;

    首先position:absolute|relative; 前者是绝对定位,后者是相对定位: position属性的四个值: static,relative,fixed,absolute; 重点重点重 ...

  9. 浅析CopyOnWriteArrayList

    CopyOnWriteArrayList引入 模拟传统的ArrayList出现线程不安全的现象 public class Demo1 { public static void main(String[ ...

  10. Spark SQL源码解析(二)Antlr4解析Sql并生成树

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 这一次要开始真正介绍Spark解析SQL的流程,首先是从Sql Parse阶段开始,简单点说, ...