提供一点补充和证明
查看原帖
提供一点补充和证明
502658
Ray662楼主2025/1/24 05:20

该贴进行一些补充和证明。

贪心细节错了很容易意识到,但很多人应该和我一样不知道如何修正。这里写一写供后人食用吧。

考虑下图情况:

假设 33 节点和 44 节点处各有 11 支军队。叶子节点 22 还未被覆盖。设 33 还剩下的可用时间为 tt。此时有两种选择:

  1. 33 的军队去 2244 的军队去 33,时间 max(a+b,b+c)\max(a + b, b + c)

  2. 33 呆在原地不动,44 的军队去 22,时间 a+ca + c

我们的贪心出错就是因为选择了方案二,但有时候方案一比方案二更优。这种情况发生当且仅当 max(a+b,b+c)<a+c\max(a + b, b + c) < a + c

即:b+max(a,c)<a+cb + \max(a, c) < a + c

分类讨论如下:

  • aca \le c,则 b+c<a+cb + c < a + c,得到 b<ab < a,即 b<acb < a \le c

  • a>ca > c,则 b+a<a+cb + a < a + c,得到 b<cb < c,即 b<c<ab < c < a

发现 b<ab < a 总是成立。

同时有一个限制,33 处军队想要到达 22,必须满足 a+bta + b \le t。由于 b<ab < at>2bt > 2b

所以,当 一支到达了根节点儿子的军队 所剩下的时间 大于 其到根节点距离的两倍,我们可以选择方案一,且此时方案一比方案二更优。

这也就解释了为何如下 Hack 的答案为 100100 而非 198198

4
1 2 99
1 3 1
1 4 99
3
3 4 4

具体实现的话加一句 if 判断一下即可。

2025/1/24 05:20
加载中...