zoukankan      html  css  js  c++  java
  • 老鼠毒药问题

    问题11000瓶水中有1瓶下了毒,老鼠只要喝一点点就会在一周之内死掉,问至少需要多少只老鼠,才能在一周之内找出是哪一瓶水有毒?(微软笔试题)

    [解析

          假设有n只老鼠,则瓶数的上限N = 2 ^ n将瓶子的10进制编号(0 - N-1)改为n位的2进制码,然后从左到右:让第1只老鼠喝所有编号的2进制码第1位是1的瓶子中的水,第2只老鼠喝所有编号的2进制码第2位是1的瓶子中的水,……,n只老鼠喝所有编号的2进制码n位是1的瓶子中的水。这里取n=2示例:

     瓶的编号

    瓶的编号的2进制表示

    是否喂给第1只老鼠(0,不喂;1,喂)

    是否喂给第2只老鼠(0,不喂;1,喂)

    0

    00

    0

    0

    1

    01

    0

    1

    2

    10

    1

    0

    3

    11

    1

    1

          这样,由第n只老鼠一周后的死活情况就可确定毒水瓶的编号的2进制码的左起第n位:老鼠死,第n位为1;老鼠活,第n位为0。

    有毒的瓶

    的编号

    有毒的瓶的编号

    2进制表示

    1只老鼠是否会死

    (0,不死;1,死)

    2只老鼠是否会死

    (0,不死;1,死)

    0

    00

    0

    0

    1

    01

    0

    1

    2

    10

    1

    0

    3

    11

    1

    1

          由此可以判断N瓶水只需log2 N只老鼠即可找出其中的毒药瓶。

    问题21000瓶水中有1瓶下了毒,老鼠只要喝一点点就会在一周之内死掉,问至少需要多少只老鼠,才能在周之内找出是哪一瓶水有毒?

    [解析

          问题2与问题1的不同之处在于,问题2中老鼠可以参加两次实验,这样,每只老鼠就有死死(第1周死掉)、生死(第2周死掉)、生生(第2周后仍然活着)3种状态问题1中每只老鼠只有生或死2种状态,所以对瓶子的编号采用了2进制,问题2中每只老鼠有3种状态,所以对瓶子的编号应采用3进制。

         假设有n只老鼠,则瓶数的上限N = 3 ^ n将瓶子的10进制编号(0 - N-1)改为n位的3进制码。

         第1次实验:

         从左到右:让第1只老鼠喝所有编号的3进制码第1位是2的瓶子中的水,第2只老鼠喝所有编号的3进制码第2位是2的瓶子中的水,……,n只老鼠喝所有编号的2进制码n位是2的瓶子中的水。这里取n=2示例:

    瓶的

    编号

    瓶的编号的

    3进制表示

    是否喂给第1只老鼠

    (0,1,不喂;2,喂)

    是否喂给第2只老鼠

    (0,1,不喂;2,喂)

    0

    00

    0

    0

    1

    01

    0

    1

    2

    02

    0

    2

    3

    10

    1

    0

    4

    11

    1

    1

    5

    12

    1

    2

    6

    20

    2

    0

    7

    21

    2

    1

    8

    22

    2

    2

          这样,由第n只老鼠第1周后的死活情况就可确定毒水瓶的编号的3进制码的左起第n位是不是2:老鼠死,第n位为2;老鼠活,第n位为0或1。

    有毒的瓶

    的编号

    有毒的瓶的编号

    2进制表示

    1只老鼠是否会死

    (0,1,不死;2,死)

    2只老鼠是否会死

    (0,1,不死;2,死)

    0

    00

    0

    0

    1

    01

    0

    1

    2

    02

    0

    2

    3

    10

    1

    0

    4

    11

    1

    1

    5

    12

    1

    2

    6

    20

    2

    0

    7

    21

    2

    1

    8

    22

    2

    2

          不妨假设毒水瓶的编号是5,则第1次实验的结果为第1只老鼠不死,第2只死掉,据此可判断出毒水瓶的编号的3进制码的左起第1位为0或1,第2位为2,所以可能的编号为2(02)或5(12)。

    第2次实验:

         对于所有还活着的老鼠,从左到右:让第1只老鼠喝所有编号的3进制码第1位是1的瓶子中的水,第2只老鼠喝所有编号的3进制码第2位是1的瓶子中的水,……,n只老鼠喝所有编号的3进制码n位是1的瓶子中的水。

     

    瓶的

    编号

    瓶的编号的

    3进制表示

    是否喂给第1只老鼠

    (0,不喂;1,喂)

    2

    02

    0

    5

    12

    1

          这样,由第n只老鼠第2周后的死活情况就可确定毒水瓶的编号的3进制码的左起第n位:老鼠死,第n位为1;老鼠活,第n位为0。

    有毒的瓶

    的编号

    有毒的瓶的编号

    2进制表示

    1只老鼠是否会死

    (0,不死;1,死)

    2

    02

    0

    5

    12

    1

    问题3N瓶水中有1瓶下了毒,老鼠只要喝一点点就会在一周之内死掉,现在由n只老鼠,问如果要求在第k结束时找出是哪一瓶水有毒,N的最大值可以取多少?

    [解析

          问题3中老鼠可以参加k次实验,这样,每只老鼠就有:第1周死掉,第2周死掉,……第k周死掉第k周后仍然活着,共(k+1)种状态。所以对瓶子的编号应采用(k+1)进制。

          假设有n只老鼠,则瓶数的上限N = (k+1) ^ n将瓶子的10进制编号(0 - N-1)改为n位的(k+1)进制码。

    第1次实验:

          从左到右:让第1只老鼠喝所有编号的(k+1)进制码中第1位是k的瓶子中的水,第2只老鼠喝所有编号的(k+1)进制码中第2位是k的瓶子中的水,……,第n只老鼠喝所有编号的(k+1)进制码中第n位是k的瓶子中的水。

          这样,由第n只老鼠第1周后的死活情况就可确定毒水瓶的编号的(k+1)进制码的左起第n位是不是k:老鼠死,第n位为k;老鼠活,第n位为0,1,……,(k-1)中的任意数

    第2次实验:

          对于所有还活着的老鼠,从左到右:让第1只老鼠喝所有编号的(k+1)进制码中第1位是(k-1)的瓶子中的水,第2只老鼠喝所有编号的(k+1)进制码中第2位是(k-1)的瓶子中的水,……,第n只老鼠喝所有编号的(k+1)进制码中第n位是(k-1)的瓶子中的水。

          这样,由第n只老鼠第2周后的死活情况就可确定毒水瓶的编号的(k+1)进制码的左起第n位是不是(k-1):老鼠死,第n位为(k-1);老鼠活,第n位为0,1,……,(k-2)中的任意数

          接下来的实验以此类推,一直进行到第k次实验为止。

  • 相关阅读:
    Python性能分析指南
    centos加入启动服务
    北京户口
    北京户口
    【汽车进口税】 关于汽车进口税计算你知道多少-汽车保险资讯-阳光车险官方网站
    在北京公司要多长时间才可以申请摇车牌号
    Kivy: Crossplatform Framework for NUI
    说说设计模式~大话目录(Design Pattern)
    说说设计模式~策略模式(Strategy)
    说说设计模式~装饰器模式(Decorator)
  • 原文地址:https://www.cnblogs.com/laifeiyao/p/3052643.html
Copyright © 2011-2022 走看看