谁能找出毒药?
今天,和一个朋友谈论了一个有趣的问题:
有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公司的面试题。狭路相逢,我同学那种解法明显已站在了制高点。汗颜~~~