3
建立有毒的葡萄酒测试计划程序
最近在Puzzling.SE上,我遇到一个问题,即当毒药仅在两种成分都被喝下时才激活时,确定更大数量的哪两个瓶子是有毒的。最终,它变得相当折磨,大多数人使用完全不同的算法设法将其减少到18或19个囚犯。 原始问题说明如下: 您是喜欢举行派对的中世纪王国的统治者。这位上次试图毒害您的葡萄酒瓶的朝臣大怒,得知您设法从十名囚犯中识别出他在1,000瓶中毒了。 这次他有点狡猾。他研发了一种复合毒药 P:一种二元液体,只有两种单独无害的成分混合时才致命。这类似于环氧树脂的工作原理。他又给您寄了1,000瓶葡萄酒。一瓶有成分C_a,另一瓶有成分C_b。(P = C_a + C_b) 喝完这两种成分的任何人都将在喝完最后一种成分的夜晚的午夜中途死亡,无论他们在白天何时吸收液体。每种有毒成分都保留在体内,直到第二种成分激活为止,因此,如果一天喝一种成分,第二天喝另一种成分,则第二天结束时您将在午夜死亡。 您下一场聚会还有两天。您需要使用最少多少名囚犯进行测试才能识别出哪两个瓶子受污染,以及在该数目的囚犯身上需要遵循什么算法? 额外的 好处是,假设您有20名囚犯的固定限制,那么理论上可以测试的最大瓶子数量是多少,从而得出关于哪些瓶子受到影响的准确结论? 您的任务是建立一个程序来解决奖金问题。对于n囚犯,您的程序将制定一个测试计划,以便能够m在m尽可能大的瓶子中检测出两个有毒的瓶子。 您的程序最初将N囚犯人数作为输入。然后将输出: M,您将尝试测试的瓶子数量。这些瓶子将被标记为从1到M。 N 行,其中包含每个囚犯将喝的瓶子的标签。 然后,您的程序将输入第一天死亡的囚犯作为输入,第一行的囚犯为1,下一行的囚犯为2,等等。然后,它将输出: N更多的行,其中包含每个囚犯将喝的瓶子的标签。死囚将有空白行。 然后,您的程序将输入第二天哪些囚犯死亡的信息,并输出两个数字A和B,表示您的程序认为哪个瓶子包含毒药。 两个囚犯和四瓶一例输入可能会去这样,如果瓶子1和3中毒: > 2 // INPUT: 2 prisoners 4 // OUTPUT: 4 bottles 1 2 3 // OUTPUT: prisoner 1 will drink 1, 2, 3 1 4 // OUTPUT: prisoner …