P5914 MOS 题解
FLY_lai
·
·
题解
一道练习贪心证明的好题。
绝大多数题解只是点出了以下结论:
要么最快的带最慢的;要么最慢的带次慢的。
并没有给出证明。我就补上这个证明。
为了证明这个贪心结论,我们先证明几个引理。
引理一:每次将火把带回来的,一定是对岸最快的。
引理一证明:如果回来的不是对岸最快的,让对岸最快的人代替这个回来的人的一切行动,发现答案至少不差。
引理二:最慢的人要么和最快的人一起过桥,要么和次慢的人一起过桥。
引理二证明:
为了方便表述,记最快的人为 a_1,次快的人为 a_2,以此类推,次慢的人为 a_{n-1},最慢的人为 a_n。
设 a_n 是与 a_p 一起过桥,a_{n-1} 是与 a_q 一起过桥。
我们有一个调整法的思路:让 a_{n-1} 和 a_n 一起过桥,让 a_p 与 a_q 一起过桥。
显然这样调整后这两次过桥的时间总和变少了。但是现在就得证是错误的。因为我们不确定改变过桥顺序是否会影响其他的过桥。
我们这样调整后唯一可能造成的影响是:如果我们希望 a_p 把火把送回来,那 a_{n-1} 和 a_n 一起过桥就会产生阻碍。
在这种情形下,尝试证明 a_p=a_1 最优。
假设 a_p\ne a_1,我们令 a_p\leftarrow a_1,容易发现,a_n 和 a_p 过桥时间不变,而 a_p 带着火把回来时间至少不变,可能更优。
综上所述,最慢的人每次过桥,要么和最快的人一起,要么和次慢的人一起。
最后的结论:要么 a_1 和 a_n 过桥,a_1 回来;要么 a_1,a_2 先过桥,a_1 回来,然后 a_{n-1},a_n 过桥,a_2 回来。
证明:考虑 a_n 和谁过桥。如果 a_n 和 a_1 过桥,由引理一,过桥后一定是 a_1 回来。
如果 a_n 和 a_{n-1} 过桥,假设是由 a_k 送回火把。因为 a_k 总是有一次过去、一次送回火把、一次回到对岸的过桥旅程,所以 a_k 会贡献至少三次时间至少为 a_k 的过桥。
如果我们先让 a_1,a_2 过桥,a_1 回来,让 a_2 送回 a_n,a_{n-1} 带过去的火把。这种方法贡献了 a_1+2a_2 的时间,a_1+2a_2\le 3a_k,更优。
以上我们证明了这种方法的正确性。如果我还有考虑不周的地方,欢迎评论指出。
代码就不贴了。有了这个结论,每次看一下送走当前 a_n,a_{n-1} 花费更少的是哪种,不停选就是了。
给个关注呗