用小白鼠喝毒药

题设:有N瓶水,其中有一瓶水有剧毒,如果小白鼠喝了会在24小时的时候死亡。

问:用多少只小白鼠能够检测出哪瓶水有剧毒?

要求:用的小白鼠数量少并且用时要短,并给出合理的过程与结论。

我的解题思路如下:

这是一个二进制开关(0/1)问题,类比于海明码校验算法,将药水进行二进制编号(0000000,0000001,0000010,0000011...),算出至少多少位二进制能够将所有的小白鼠进行完全编号;

然后根据二进制的位数选取小白鼠,将小白鼠对应于相应二进制位,之后去依次遍历不同小白鼠的相同位,如果此位为1则喝下一点此瓶的药水,此位为0则不喝(至于怎么喝不是我们考虑的范围内,可以先按位进行药水的混合,放到其他的瓶中,再让小白鼠去喝混合后的药水,当然混合后的药水数量与选取小白鼠数量是相同的);

最后通过小白鼠的死活去鉴定哪瓶药水有剧毒。

类比实例分析:

1)         假设共有6瓶药水,其中1瓶有剧毒,其他无毒

2)         通过计算 2^3 = 8 >= 6,可知3位二进制数可以完全对所有药水瓶进行编号,因此我们要选取3只小白鼠做实验

3)         对药水瓶进行二进制编号,并且让小白鼠按位去喝药水(遇见1喝,遇见0不喝),示意图如下所示:


小白鼠

二进制码

水瓶编号


A


B


C


0


0


0


0


1


0


0


1


2


0


1


0


3


0


1


1


4


1


0


0


5


1


0


1

然后让小白鼠A去喝编号为4、5瓶中的水;小白鼠B去喝编号为2、3瓶中的水;小白鼠C去喝编号为1、3、5瓶中的水

如果小白鼠A、B、C都没死(000),则编号为0的水瓶中的水有剧毒;

如果小白鼠A、B没死,C死(001),则编号为1的水瓶中的水有剧毒;

如果小白鼠A、C没死,B死(010),则编号为2的水瓶中的水有剧毒;

如果小白鼠A没死,B、C死(011),则编号为3的水瓶中的水有剧毒;

如果小白鼠A死,B、C没死(100),则编号为4的水瓶中的水有剧毒;

如果小白鼠A、C死,B没死(101),则编号为5的水瓶中的水有剧毒;

(实质上:我们可以保持小白鼠的位置不变,给没死的小白鼠贴上标签0,死的贴上标签1,会得出一串二进制码,在将此段二进制码转换成为十进制,即得出有剧毒水瓶的编号)

4)         随着水瓶数量N的增加,我们通过 2^M >= N 计算出所需要的小白鼠的数量M即可

时间: 2024-08-22 22:12:53

用小白鼠喝毒药的相关文章

小白鼠试毒药问题

题目如下: 实验室里有1000个一模一样的瓶子,但是其中的一瓶有毒.可以用实验室的小白鼠来测试哪一瓶是毒药.如果小白鼠喝掉毒药的话,会在一个星期的时候死去,其他瓶子里的药水没有任何副作用.请问最少用多少只小白鼠可以在一个星期以内查出哪瓶是毒药:    a. 9    b. 10    c. 32    d. 999    e. 以上都不对 这个题目很简单,拿来复习信息论和二进制编码的粗浅知识刚好合适. 首先呢,如果让我使用我的LabTop解题,那么简单了,用1000只小白鼠去试验,将瓶子和白鼠编

关于数字的智力题-小白鼠与毒药

题目: 有1000瓶药物,但是其中有一瓶是有毒的,小白鼠吃了一个星期以后就会死掉!请问,在一个星期内找出有毒的药物,最少需要多少只小白鼠? 解答: 用二进制的思路去思考,1000瓶药代表了1000种状态,那么1000用二进制表示可以用一个10位的二进制数就可以全部表示出来,考虑用十只白鼠来试验,用0和1代表它们最终的状态即死亡或活着,初始状态十只白鼠表示为0000000000. 关于数字的智力题-小白鼠与毒药,布布扣,bubuko.com

小白鼠试毒药,最少需要多少即可试出结果

有 1000  桶酒,其中 1  桶有毒.而一旦吃了,毒性会在 1  周后发作.现在我们用小老鼠做 实验,要在 1  周内找出那桶毒酒,问最少需要多少老鼠. 一只老鼠喝酒后又两种状态:死(0)和活(1). 所以10只老鼠就能表示2的10次方个状态(即1024个).2^0表示2的零次方.2^8表示2的8次方. 设有10只老鼠编号分别为2^0,2^1, 2^2, 2^3, 2^4, 2^5, 2^6, 2^7, 2^8, 2^9.有1000桶酒编号为1,2,3....一直到 1000. 任何一桶酒的

我是一只小白鼠

我是一只小白鼠,我可能很胆小.因为我害怕,我怕自己不够好.我怕被别人比下去.我怕我会落后.我怕学历不如别人.我怕我没有别人过得好... 所以我一直在努力,一直像一只小白鼠一样,不断试验着.我不会说:是被别人不断做试验,我想说:我是我的小白鼠,我是自己不断的试验.我在尝试着,尝试着去改变我的生活. 2010年我初中毕业,现在2016年了.偶尔会回想过去和现在,发现自己真的懂事了不少,对于我而言,三观早改了.很多时候我都感觉,我像是成功了一样的幸福感和幸运感.我今年22岁,我所指的成功,并非金钱或者

2943:小白鼠排队-poj

2943:小白鼠排队 总时间限制:  1000ms 内存限制:  65536kB 描述 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“blue”等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入 输入第一行为一个整数N,表示小白鼠的数目.下面有N行,每行是一只白鼠的信息.第一个为不大于1000的正整数,表示白鼠的重量,:第二个为字符串,表示

题目1110:小白鼠排队 Java

题目描述: N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用"red","blue"等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入: 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目. 下面有N行,每行是一只白鼠的信息.第一个为不大于100的正整数,表示白鼠的重量,:第二个为字符串,表示白鼠的帽

1110.小白鼠排队

题目描述: N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用"red","blue"等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入: 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目. 下面有N行,每行是一只白鼠的信息.第一个为不大于100的正整数,表示白鼠的重量,:第二个为字符串,表示白鼠的帽

小白鼠排队

题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用"red","blue"等字符串来表示.不同的小白鼠可以戴相同颜色的帽子.白鼠的重量用整数表示. 输入描述: 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目. 下面有N行,每行是一只白鼠的信息.第一个为不大于100的正整数,表示白鼠的重量,:第二个为字符串,表示白鼠的

IT小白鼠第二天

今天说说感受吧 已经来了快一周了  实在是蒙圈的厉害  以前学习俄语的  英语一点都不懂 要老命了 好了不说了 下面给大家分享下 今天讲解的各大知识点 循环 while 条件: 代码块(循环体) break 彻底停止当前本层循环 continue 停止当前本次循环. 继续执行下一次循环 else: # 当条件为假的时候会执行else 代码块 2. 格式化输出 %s 占位字符串 用这个 %d 占位数字 3. 运算符(难点) and 并且. 左右两端同时为真. 结果才能是真 or 或者. 左右两端有