P5914 MOS 题解

一道练习贪心证明的好题。

绝大多数题解只是点出了以下结论:

要么最快的带最慢的;要么最慢的带次慢的。

并没有给出证明。我就补上这个证明。

为了证明这个贪心结论,我们先证明几个引理。

引理一:每次将火把带回来的,一定是对岸最快的。

引理一证明:如果回来的不是对岸最快的,让对岸最快的人代替这个回来的人的一切行动,发现答案至少不差。

引理二:最慢的人要么和最快的人一起过桥,要么和次慢的人一起过桥。

引理二证明:

为了方便表述,记最快的人为 a1,次快的人为 a2,以此类推,次慢的人为 an1,最慢的人为 an

an 是与 ap 一起过桥,an1 是与 aq 一起过桥。

我们有一个调整法的思路:让 an1an 一起过桥,让 apaq 一起过桥。

显然这样调整后这两次过桥的时间总和变少了。但是现在就得证是错误的。因为我们不确定改变过桥顺序是否会影响其他的过桥。

我们这样调整后唯一可能造成的影响是:如果我们希望 ap 把火把送回来,那 an1an 一起过桥就会产生阻碍。

在这种情形下,尝试证明 ap=a1 最优。

假设 apa1,我们令 apa1,容易发现,anap 过桥时间不变,而 ap 带着火把回来时间至少不变,可能更优。

综上所述,最慢的人每次过桥,要么和最快的人一起,要么和次慢的人一起。

最后的结论:要么 a1an 过桥,a1 回来;要么 a1,a2 先过桥,a1 回来,然后 an1,an 过桥,a2 回来。

证明:考虑 an 和谁过桥。如果 ana1 过桥,由引理一,过桥后一定是 a1 回来。

如果 anan1 过桥,假设是由 ak 送回火把。因为 ak 总是有一次过去、一次送回火把、一次回到对岸的过桥旅程,所以 ak 会贡献至少三次时间至少为 ak 的过桥。

如果我们先让 a1,a2 过桥,a1 回来,让 a2 送回 an,an1 带过去的火把。这种方法贡献了 a1+2a2 的时间,a1+2a23ak,更优。

以上我们证明了这种方法的正确性。如果我还有考虑不周的地方,欢迎评论指出。

代码就不贴了。有了这个结论,每次看一下送走当前 an,an1 花费更少的是哪种,不停选就是了。

给个关注呗

posted @   FLY_lai  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示