老鼠尝毒药

老鼠尝毒药题目
题目的形式一般是:有 n 瓶水,其中一瓶有毒。假设老鼠接触毒药后 5 分钟死亡。最少需要多少只老鼠才能在最短的时间找出哪瓶水有毒?(假设最少老鼠的数量为 m 吧)
分析
这道题目其实考的是二进制比特串能表示的状态数量。比如一个比特位能表示两种状态:0 和 1。而两个二进制比特位能表示 4 种状态:00,01,10,11。而在这个题目上下文中,老鼠也有两种状态:活和死。这样我们就可以将一只老鼠当做一个比特位,老鼠活着为 0,死了为 1。 两只老鼠就可以表示四种状态:00(活活),01(活死),10(死活),11(死死)。好了,现在我们可以用 m 只老鼠表示 2 的 m 次方种状态了。
然后我们给每瓶水从 0 开始编号。然后将某瓶水有毒对应一种状态。n 瓶水最多有 n 种状态。几只老鼠能表示的状态数,我们知道了,水可能的状态数我们也知道了。所以理论上我们只需要找到某种老鼠尝毒药的方案,5 分钟后,老鼠就会出现一种状态,只要能将老鼠的状态一一对应到水的状态,我们就能唯一辨别出哪瓶水有毒。只需要 2 的 m 次方 >= n,m 只老鼠就可以完整表示 n 瓶水的状态。满足这表达式的最小 m 就是答案。
我们先不管是怎么对应的,只知道是一一对应就行。
一个简单实例
假设现在 n = 4,即有4 瓶水,4 瓶水可能有 4 种状态。2 的 2 次方 = 4。所以我们只需要两只老鼠就可以对应 4 种状态。这种情况下,老鼠和水的一种一一对应关系如下:

QQ截图20170318225307.jpg (13.81 KB, 下载次数: 0)

下载附件  保存到相册

2017-3-18 22:53 上传

所以,我们只需要 2 只老鼠就可以找出哪瓶水有毒。两只老鼠都没死,说明第 0 瓶水有毒;两只都死了就是第 3 瓶水有毒;第 0 只活着,第 1只死了就是第 2 瓶水有毒;第 0 只死了,第 1 只活着就是第 1 瓶水有毒。
我们让老鼠以某种方式尝水后,5 分钟后根据老鼠的状态就可以判断出哪瓶水有毒。
老鼠喝毒药的方案
虽然上面给出了对应关系,但是你可能不相信。活着你很好奇怎么安排老鼠喝毒药。我们现在来根据上面的对应关系,找出喝毒药的方案。
第 0 瓶水有毒时,两只老鼠都活着,说明两只老鼠都没喝第 0 瓶水。
第 1 瓶水有毒时,第 1 只老鼠死了,说明第 1 只老鼠喝了第 1 瓶水,而第 0只没喝。
第 2 瓶水有毒时,第 0只老鼠死了,说明第 0 只老鼠喝了第 2 瓶水,而第 1只没喝。
第 3 瓶水有毒时,两只老鼠都死了,说明两只老鼠都喝了第 3 瓶水。
所以方案是:
第 0 只老鼠要喝:第 2 瓶,第 3 瓶。
第 1 只老鼠要喝:第 1 瓶,第 3 瓶
根据方案和结果判断哪瓶水有毒
根据上面的方案,我们再来推一推。验证方案是否正确。
如果两只老鼠都活着,说明第 1,2,3 瓶水都没毒。有毒的自然是第 0 瓶。
如果第 0 只老鼠活着,而第 1 只老鼠死了,说明第 2 3 瓶水没毒,第 1 瓶水有毒。
如果第 0 只老鼠死了,而第 1 只老鼠活着,说明第 1 3 瓶水没毒,第 2 瓶水有毒。
如果两只老鼠都死了,说明 2 3 中有一瓶有毒,1 3 中有一瓶有毒,所以可以推出有毒的是第 3 瓶水。
总结
所以不管 n 的值是多少,根据只有 2 的 m 次方能表示大于等于 n 就行。假设 n = 1024,m = 10 就行。如果 n = 1025,10 只老鼠最多表示 1024 种状态,所以 10 只不行,得 11 只。11 只能表示 2048 种状态,肯定能识别出水的 1025 种状态。所以总结一下 m 的取值为:满足 2 的 m 次方 >= n 的最小 m 值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值