现在的位置: 首页 > 综合 > 正文

一道有趣的智力题 -- 小强试毒实验

2014年02月15日 ⁄ 综合 ⁄ 共 1206字 ⁄ 字号 评论关闭
Last Modified : 2007-07-24-14:00

同学在 BBS 看到的题,挺有趣的,还好我没花多少时间就想出来了。

有1000瓶水,其中有一瓶有剧毒(假设哪怕一个毒药分子在里面也能致命),现在给你10只
小强在24小时内通过小强试药的方式鉴定出来哪瓶药有毒。
情况1:假设小强服药后2小时内即可判断是否中毒,鉴别方案有哪些?
情况2:假设小强服药之后最迟要20小时才能判断是否中毒,鉴别方案又是什么?

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

情况1:
很简单,用二分法就可以了。让一只小强喝500瓶水,2小时后,
① 小强死了说明毒药在这500瓶中,让另一只小强喝其中250瓶,依此类推..
② 否则在另外500瓶,让小强喝这另外500瓶的其中250瓶..
210  = 1024 > 1000
2  * 10  =  20  <  24
因此可以保证在规定时间内鉴别出来哪瓶药有毒。
不过我想的方法是每次都把所有活小强来试药,就是 10  分, 9 分,…… 法。会更加早完成鉴别。

情况2:

对于每一瓶药水,每一只小强可以喝它,也可以不喝(由实验者决定)。如果不喝用 0 表示, 喝用 1 表示,而且给小强从 0 开始编号,那么每一瓶药水对应一个二进制数字(注意:小编号对应该数字的右边,如图所示,小强喝掉连线的药水),而且各不相同(否则,如果某两瓶的数字相同,即所有小强要么同时喝两瓶,要么两瓶都不喝,那么如果其中一瓶有毒,就鉴别不出来了),将这个数字作为该瓶药水的编号。20 小时后,该死的小强都死了,根据它们的生死情况,生用 0 表示,死用 1 表示,那么所有小强的生死情况对应一个二进制数字,也就是有毒的那瓶药水的编号了。如下图,3 只小强,8 瓶药水, 最后的生死情况假设是“死死生”,那么对应数字是 110 ,也就是说 6 号药水有毒。(这是因为 “6 号药水的二进制数字是 110,即 2 号小强喝了1 号小强喝了, 0 号小强没喝。” ⇔ “最后生死情况是:2 号小强死,1 号小强死, 0 号小强生。”

小强试读实验

从图中容易得出规律,第 i 只小强从第 2i 瓶药水开始,连续喝 2i 瓶,然后连续不喝 2i 瓶,依次类推。
其实首先可以乱序地给药水和小强分别编号(号码从 0 开始),然后根据上面的规律操作。最后根据生死情况来判断毒药的编号。

举例如下:
假如有 4 瓶药,编号是 0, 1, 2, 3。
有两只小强,编号是 0, 1。
用第 0 只小强来试第 1 ,3 瓶药,用第 1 只小强来试第 2, 3 瓶药。
如果只有第 0 只小强死,那么第 1 瓶药有毒;如果只有第 1 只小强死,那么第 2 瓶药有毒;如果两只都死,那么第 3 瓶有毒; 如果两只都没死,那么第 0 瓶有毒。

也可以知道, n 只小强最多能够鉴别出 2n 瓶药水中的一瓶毒药,而且如果刚好有2n  瓶药水,那么每只小强就要喝 2n - 1 瓶药水。

有兴趣来亲自做一下这个实验吧^_^

补充:
这道题和下面地址的题有异曲同工之妙,二进制的精髓之所在,哈哈。。
TopCoder 每周一赛的一道题 -- 概率计算(解题报告)

抱歉!评论已关闭.