小白鼠检测液体

来源:互联网 发布:那英 唱功 知乎 编辑:程序博客网 时间:2024/04/28 05:54


本文地址:      http://blog.csdn.net/hftenger/article/details/7600764

Q:  我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分?

 

A:  实际上题目出的不太严谨,我们假设总共有N瓶液体,以便下面进行展开。

1.      我们先来看一个更简单的情形,假设我们现在只有一只小白鼠:

这个时候我们还需要对N进行分类讨论:

1.1          如果N==2,小老鼠喝掉其中一瓶,最终死掉,则喝掉的有毒,另外一瓶无毒;反之,你懂的。所以一只小白鼠可以确定2瓶;

1.2          如果N==3,小老鼠有2种选择,要么喝掉一瓶,要么喝掉两瓶。喝掉一瓶死掉,那么可以确定3瓶,没死掉则只能确定1瓶;喝掉两瓶死掉,那么可以确定1瓶,没死掉则可确定2瓶。因此综合来看这个时候只能确定1瓶;

1.3          如果N>=4,这个时候可以确定[N/2](取整)瓶,只需把所有的瓶子分成两个部分,让这只小白鼠试喝其中一半,如果最终死掉,则可确定另一半无毒,如果没死,则可确定所喝的那一半无毒;

2.      现在更进一步,假设我们现在有2只小白鼠:

需要注意到的一个地方是,两只老鼠可以给我们展示出2^2=4种状态。我们假设小白鼠分别为A, B, 喝完死掉与没死分别为0,1。四种状态分别是

A0B0    A1B0    A0B1   A1B1

同样得,2只老鼠实际上也只能对4瓶水p1, p2, p3,p4产生不同的喝法:

0      0     p1

1      0     p2

0      1     p3

1      1     p4

----------------------

A      B

其中1表示喝,0表示不喝。

 

下面开始展开:

同样,我们对N进行分类讨论,结合上面的讨论,如果N<4,那么两只老鼠完全可以把N瓶液体全部检测出来,你懂的,所以下面的讨论从N==4开始:

2.1          如果N==4,那么

A0B0    -->    p1有毒

A1B0    -->    p2有毒

A0B1    -->    p3有毒

A1B1    -->    p4有毒

计算方法可用下面的方法:

1*(0 OR 1)              NULL         =     ?

NULL                  1*(0OR 1)      =     ?

1*(0 OR 1)  &&  1*(0 OR 1)     =     ?

---------------------------------------------

A*(0 OR 1)            B*(0OR 1)

?为1则有毒,为0则无毒,因为N==4的关系,如果3个都没毒,则剩下的必然就有毒了,所以A0B0-->p1有毒。

2.2          如果N==5,则我们可以将N分成4份(1瓶,1瓶,1瓶,2瓶),类似于2.1&1.2,假设p1,p2,p3,p4分别代表其中的4份。则我们可以确定出3*[N/4]瓶。

2.3          如果N==6,则我们可以将N分成4份(1瓶,1瓶,2瓶,2瓶),类似于2.1&1.2,假设p1,p2,p3,p4分别代表其中的4份。则我们可以确定出2*[N/4]+1*([N/4]+1)瓶。

2.4          如果N==7,则我们可以将N分成4份(1瓶,2瓶,2瓶,2瓶),类似于2.1&1.2,假设p1,p2,p3,p4分别代表其中的4份。则我们可以确定出1*[N/4]+2*([N/4]+1)瓶。

2.5          如果N==8,则我们可以将N分成4份(2瓶,2瓶,2瓶,2瓶),类似于2.1&1.2,假设p1,p2,p3,p4分别代表其中的4份。则我们可以确定出3*[N/4]瓶。

2.6          如果N==4*a+i (i=1,2,3,4), 则可确定3*[N/4]+t    (i=1,4-->t=0;  i=2-->t=1;  i=3-->t=2)

(假设a为任意自然数,下同)

3.      推广到一般情形,假设有K只小白鼠,那么:

3.1          N==2^K,则可确定N瓶;

3.2          N==a*2^K+i(i=1,2,3,…,2^K-1,2^K),则可确定

(2^K-1)*[N/2^K]+t    (i=1,2^K-->t=0;  i=2-->t=1;  …; i=2^K-1-->t=2^k-2)


总结一下,利用K只老鼠,至少可检测出max((2^K-1)*(N/2^K), N)瓶液体。

欢迎批评指正。多说一句,小白鼠还是太无辜了。。