老鼠喝毒药问题

我们有很多瓶物色的液体,其中有一瓶是毒药,其他是蒸馏水,试验的小白鼠喝了以后 会在5分钟后死忙,而喝到蒸馏水的小白鼠则一切正常。我们现在有5只小白鼠,请问 一下,我们用这五只小白鼠,5分钟的时间,能够检验多少瓶液体的成分(检验成分是指 确定这瓶液体是蒸馏水还是毒药)?

  • A. 5瓶

  • B. 6瓶

  • C. 31瓶

  • D. 32瓶

答案:C

计算公式:2^n-1(n是老鼠数量)

其实就是把瓶子从1开始编号,按如下方案分配:

  • 老鼠 1 喝:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31

  • 老鼠 2 喝:2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31

  • 老鼠 3 喝:4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31

  • 老鼠 4 喝:8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31

  • 老鼠 5 喝:16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

从二进制的角度来看,就是将这5只老鼠分别对应到二进制的5个bit位上,如下:

  • 老鼠 1:_ _ _ _ 1

  • 老鼠 2:_ _ _ 1 _

  • 老鼠 3:_ _ 1 _ _

  • 老鼠 4:_ 1 _ _ _

  • 老鼠 5:1 _ _ _ _

然后对于每个瓶号,将其为1的每个bit位对应到相应的老鼠,然后把该瓶子给这些老鼠喝。比如3号瓶子,3的二进制数是00011,那么就将3号瓶子给老鼠1和老鼠2喝,类似的,4号瓶子(00100)只需给老鼠3喝,所以最终每个老鼠都喝了2^n/2个瓶子。然后根据哪些老鼠死掉了,就可以推出毒药的瓶号。比如,老鼠1和老鼠2死了,老鼠3和老鼠4活着,那么必然是3号(00011)瓶子有毒。

需要注意的是,这里二进制数00000并没有被用到,因为0就代表没有老鼠需要喝瓶子,所以最终结果是2^5-1=31。题目也说了瓶子数量很多(假设无限多),假如32号瓶子是毒药,那么按规则这5只老鼠也根本不会去喝32号瓶子,因为我们没有更多的老鼠去验证31号之后的那些瓶子了,自然就无从得知了。

另外还有一种思路,是从十进制排列组合的角度来看的,详见:http://blog.csdn.net/river_like/article/details/21412177


ok,现在换一种问法:

如果有1000个瓶子,其中只有一瓶装有毒药。那么请问:至少需要几只老鼠才能找出毒药呢?

答案:需要10只老鼠。因为1000个瓶子需要10个bit位来表示瓶号 (1000 ≤ 2^10-1),然后按照前面约定的规则,把瓶子的液体分散给多个老鼠喝,最后看看哪些老鼠死了,即可确定装有毒药的那个瓶子。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值