谁能找出毒药?

 

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

  有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公司的面试题。狭路相逢,我同学那种解法明显已站在了制高点。汗颜~~~



posted @ 2012-04-01 19:14  Newwayy  阅读(3664)  评论(25编辑  收藏  举报