• 用小白鼠鉴别有毒药水问题


    题设:有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即可

  • 相关阅读:
    定制博客园CSS
    后记:Cookie安全大辩论总结
    硬造的轮子趟过的坑--浮点型转字符串函数
    支付宝Cookie高危漏洞引发的思考
    博客园人氣提升密籍
    写个PHP框架吧
    开发一个程序员专用的搜索引擎
    三种常见网站工程师招聘条件总结
    golang之vscode环境配置
    golang环境安装
  • 原文地址:https://www.cnblogs.com/yf2196717/p/15566122.html
Copyright © 2020-2023  润新知