谁能找出毒药?

 

  今天,和一个朋友谈论了一个有趣的问题:

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


  眨看之下,貌似:”有一堆砝码,有一个不准,最少几次称量可以找出这个砝码?“

  但这问题关键是:”你只有一次验证答案的机会!“ 不管你采取什么措施,你只能揭晓答案一次。

  我是学计算机的,所以对数字比较敏感。210 = 1024!所以,我先假设有1024个瓶子,其中只有1瓶毒药。

  1. 将1024分成两个512,即512a和512b。从512a的各瓶中,各取1滴水,给1号小白鼠吃;

  2. 将两个512分别分成两个256,即,512a分成了256a、256b,并且512b也分成了256a、256b。从两个256a中,照旧每瓶取一滴,给2号小白鼠吃;

  3. 同样的道理,依次分为4个128a、128b,将a各取一滴,给3号小白鼠吃;

    8个64a、64b,将a各取一滴,给4号小白鼠吃;

    16个32a、32b,将a各取一滴,给5号小白鼠吃;

    32个16a、16b,将a各取一滴,给6号小白鼠吃;

    64个8a、8b,将a各取一滴,给7号小白鼠吃;

    128个4a、4b,将a各取一滴,给8号小白鼠吃;

    256个2a、2b,将a各取一滴,给9号小白鼠吃;

    512个1a、1b,将a各取一滴,给10号小白鼠吃;

  4. 现在,大功告成,坐等一周后的结果:

    若1死,则毒药在512a中;否则,在512b中;

      若2死,则在256a中;否则,在256b中;同时,根据1的结果,可判定这个256来自512a还是512b;

        。。。

          最后,可以唯一地确定这个”1“来自哪里,也就确定了它是第几瓶。


  若为1000瓶,则也是不断划分,划分的时候,优先满足2的整数次幂划分(如1000分为,512a和488b)。划分到后面还有点变化,有兴趣的自己探讨吧。


 

  我那同学,提出了一种更简单明了的思路:

  1. 将所有瓶子编号,1、2、3、... 、1000;

  2. 将所有编号转换成对应二进制数, 0000000001,0000000010,0000000011,...,1111101000;

  3. 给1号小白鼠吃所有二进制数最低位为1的药,如,1、3、5、7、...

    给2号小白鼠吃所有二进制数中,次低位为1的药,如,2、3、4、6、...

      。。。。

        给10号小白鼠,吃所有二进制数中,右数第10位为1的瓶子对应的药,如,512、513、514、...

  4. 最后,根据死去的小白鼠就可以推断出是哪瓶为毒药,如,第2、4、7、9个小白鼠死了,那么对应的二进制数为0101001010,即,第660瓶为毒药!


  这种问题,很可能成为IT公司的面试题。狭路相逢,我同学那种解法明显已站在了制高点。汗颜~~~



转载于:https://www.cnblogs.com/newwayy/archive/2012/04/01/2429236.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值