6364. 【NOIP2019模拟2019.9.21】养马(horse)

Problem

求⼀个dfs顺序,满⾜各个时刻体⼒不⼩于0的最⼩休息值。

Data constraint

n ≤ 1 0 5 n\le 10^5 n105

Solution

显然是要贪心。

考虑一种最优策略:如果当前从某个点 x x x遍历其子树,保证在 x x x内就已经休息好,即不会出现在他儿子内的某个点休息,这样的策略显然最优。

我们设这样的休息时间为 L x L_x Lx

考虑已经处理好儿子的 L j L_j Lj,现在要求当前节点的 L i L_i Li.

显然,我们要对儿子分类讨论,因为有些儿子只要你休息够了,走他们你的休息值会变得更大,显然要先做这些使得你的休息值会变得更大的儿子。

对于这些儿子,你可以考虑一种最优策略,即先处理 L j L_j Lj比较小的儿子,因为你每次加 V j V_j Vj会使你越来越大,所以如果处理到某个 L j L_j Lj时不够走,即 S < L j S\lt L_j S<Lj,那么加上 L j − S L_j-S LjS是必然的,即这些值是至少要加上的,把每次都至少要加上的,那么总的就是最少要加的,所以最优。

然后考虑那些使你休息值变小的儿子。

这时就有一些不同了,注意到此时你不能再直接按照 L j L_j Lj较小的做,因为你会使 S S S变小,从而影响到其他的 L j L_j Lj,于是我们可以把它看作影响了 L j + V j L_j+V_j Lj+Vj,因为对于一个 L j + V j L_j+V_j Lj+Vj当前最大的,你至少要加上 L j − S L_j-S LjS的贡献,因为无论如何你的 S S S不可能更大了,所以至少要加上这么多的贡献,加上这些至少的贡献,然后再加上 V j V_j Vj去影响别人,因为 L j + V j L_j+V_j Lj+Vj已经最大,所以对其他点的影响必然是最小的。这是因为某个 L j L_j Lj比较小的你不一定会加上 S − L j S-L_j SLj的贡献,你有可能加上其他的 V j V_j Vj后都还比它大,但是那些 L j L_j Lj最大的则是至少贡献了,所以只需按照 L j + V j L_j+V_j Lj+Vj从大到小排即可最优。

当然你也可以用题解的那种处理方式,即先把所有的 V j V_j Vj加上然后再处理,本质上是一样的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值