1000瓶水10只小白鼠问题-面试题目

1000瓶水10只小白鼠问题-面试题目

题目

有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出那个瓶子里有毒药?(1000瓶水,1瓶毒药,1星期死亡,10只老鼠)

思路

并行二分法

只有一个星期时间,并且老鼠喝药后一个星期后才会出结果,所以要一次喝完后就可以根据老鼠的死活情况知道结果,题目中有一个条件没有说,就是不同瓶水之间可以混在一起给老鼠喝。


正常情况下,使用二分法,将1-1000瓶水一次编号,将第1-500瓶水每瓶水各取一滴水混在一起给第一只老鼠喝,如果老鼠死了,说明毒药在1-500之间,如果没死,则毒药在501-1000之间。
假如毒药在1-500之间则再将1-250瓶水混在一起给第二只老鼠喝,进一步确定毒药区间,10只老鼠,2^10=1024,可以决定1024瓶水以内的毒药状态。
本题只有一次机会,不能依次让老鼠喝药,所以只能同时将水混合后给老鼠喝。
变通一个方法,可以这样混水,将1-500混合给第一只老鼠喝,将1-250.501-750混合给第二只老鼠喝,将1-125,250-375,501-625,750-875混合给第三只老鼠喝,依次类推,第一只老鼠死活决定毒药是否在前半区间,第二只老鼠死活可以决定是否在1-250.501-750区间,依次类推,10只老鼠可以最后知道哪瓶为毒药。

位域法

一只老鼠死活可以决定2瓶水哪瓶为毒药,有两种状态,两只老鼠可以组合4中状态,决定4瓶水哪瓶为毒药,则10只老鼠,2^10=1024,理论上可以解决1024瓶水中哪瓶为毒药。


1000瓶水依次编号,10只老鼠依次编号。
第一瓶水给第一只老鼠喝,如果其他老鼠都没死,第一只老鼠死了则第一瓶水为毒药,老鼠死活状态为0000000001
第二瓶水给第二只老鼠喝,如果其他老鼠都没死,第二只老鼠死了则第二瓶水为毒药,老鼠死活状态为0000000010
第三瓶水中取出一滴给第一只老鼠,也取出一滴给第二只老鼠喝,如果第一只和第二只老鼠同时死了,其他老鼠都没死,则说明第三瓶水有毒,因为只有第一和第二只老鼠同时喝了第三瓶水,老鼠死活状态为0000000011
依次类推,将所有水按前面思路分给10只老鼠后,混合的水被老鼠依次喝了后,死活状态就可以判断出是哪瓶水有毒。


换个思路进一步理解下,对于第一只老鼠来说,喝的混合水中有第一瓶中的水喝第三瓶中的水,死活状态可以将范围缩小到1,3瓶水中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值