老鼠与毒药问题

简介: 大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?     这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。

大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

    这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

    现在,有意思的问题来了:如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

 
    答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 37 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ⋯⋯也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

    类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)n 个瓶子中检验出毒药来。

目录
相关文章
|
机器学习/深度学习 Python
乌鸦喝水之谜
乌鸦喝水之谜
132 0
12:骑车与走路
12:骑车与走路
187 0
14:大象喝水
14:大象喝水
160 0
犬心犬意 - 狗为什么会趴在地板上睡觉,不怕着凉吗?活久见
犬心犬意 - 狗为什么会趴在地板上睡觉,不怕着凉吗?活久见
85 0
犬心犬意 - 狗为什么会趴在地板上睡觉,不怕着凉吗?活久见
|
Windows
谁是杀人凶手
谁是杀人凶手
135 0
谁是杀人凶手
主人含泪杀病狗
主人含泪杀病狗
149 0
主人含泪杀病狗
|
弹性计算 关系型数据库 MySQL
在知识的海洋里喝水
福建疫情来袭,宿舍上课之际。闲来无事为协会创建一个官网。以便后续纳新等后续各项事宜发布。试运营之后将接入学校官网。
在知识的海洋里喝水
和“利奇马”赛跑的男人
超强台风“利马奇”,国际编号:1909,正在向浙江沿海靠近。这是今年以来登陆我国的最强台风。
1819 0
|
程序员
“三只猫,三分钟,捉三只老鼠,多少只猫,一百分钟,捉一百只老鼠”有感
      《寄存器,堆,堆栈,和一次面试的经历 》这里的关于寄存器的俺不懂,不过对于猫咪做老鼠的倒是有点感想。       三只猫,三分钟,捉三只老鼠,那么这三只可爱的猫咪是怎么找的老鼠呢?我们可以猜想一下。
1186 0