10只狗怎么鉴别1000瓶水哪瓶有毒

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


凌晨发了个帖子,没想到十大了。。。强人很多,第一页就出现这么多正确答案。看来很多人都对二进制很敏感呀!这个应该可以归为算法或者算法相关的题目, 《编程珠玑》里面有类似的案例讲解,一个好的策略(算法)能得到很好的时间复杂度和空间复杂度。

看到不少人说这题目出的太残忍了,我自己也属狗的,改蟑螂来做实验品好了:)

我一个本科同学上午十点的作答,除了8小时就可以得到正确答案的那个方案我还在验证,其他的两种可以算作陈述比较详细的正确答案:)

情况1:假设狗服药后2小时内即可判断是否中毒,鉴别方案有哪些?
      方法一:因为2的10次方1024>1000,可以做10次分半测试。每次测原来一半数目的药瓶,确定在哪一半里面,再重复。
      给1000个药瓶编号,最开始用1号狗闻1号到500号药瓶,两小时后1号狗死则可确定有毒药瓶在1-500号中,否则在501-1000号 中;确定后用第二条狗闻确定毒药存在其中的的500个瓶子的前250个瓶子,两小时后可确定在哪250个瓶子中有毒药瓶;类似依次 125,63,32,16,8,4,2,1。最坏的情况死掉10条狗,10*2小时内找到毒药瓶。
      方法二:1000除以10=100,每条狗喝不同的100种混合在一起的药,可知毒药在哪100种里,100再除以9=11+1=12,每条 狗喝12种混合在一起的,可知在哪12种里,接下来就不用说了,8小时内就可以知道了。
     方法三:见情况二。

情况2:假设狗服药之后20小时才能判断是否中毒,鉴别方案又是什么?
                还是因为2的10次方1024>1000,用10条狗闻(1)或者不闻(0),最后死(1)或者不死(0)可组合 1024个不同状态,各代表一个瓶号,可一次性将毒药瓶找出。
        假设有3条狗要找出8瓶药中的一瓶毒药(2的3次方=8)。3条狗分别代表3个二进制数位。
        瓶号        二进制        狗的状态
        瓶0        000        3条狗都不闻
        瓶1        001        3号狗闻
        瓶2        010        2号狗闻
        瓶3        011        2号,3号狗闻
        瓶4        100        1号狗闻
        瓶5        101        1号,3号狗闻
        瓶6        110        1号,2号狗闻
        瓶7        111        1,2,3号狗闻        

        20小时后,3条狗的死和活就是上面8种状态组合。假设20小时后只有2号,3号狗死了,说明瓶3有毒; 假设20小时后,1号,2 号,3号狗都死了,说明瓶7有毒。
        把这个例子推广到10条狗1000瓶药即可,只是10条狗代表10个二进制数位。
        其实情况1也可以这么解决,麻烦一点。
                而且如果情况2是准时在20小时会中毒死亡的话,一条狗可以在不同时间吃药(20小时到24小时还有4个小时),那根据 死亡时间不同来确定是第几瓶也是一种方法,不过那太容易了。
                 可怜的Puppy。