1000瓶药水,1瓶有毒药,几只小白鼠能够找出?

分享一道码工面试的常见题:1000瓶药水,1瓶有毒药,服用后一小时毒发,毒药可以无限稀释,那么一小时内用几只小白鼠能够找出毒药?

这道题考察的是对2进制的理解,具体实现与3老鼠确定8瓶子原理一样。

000=0
001=1
010=2
011=3
100=4
101=5
110=6
111=7

每位数表示一只老鼠,0-7表示8个瓶子。即将1,3,5,7号瓶子的药混合取样给鼠1吃,2,3,6,7号瓶子混合取样给老鼠2吃……死鼠相应的位标为1。如鼠1死了,鼠2没死,鼠3死了,那么就是101=5号瓶子有毒。N只老鼠的量程为2^N,1000只瓶子位于2^9 ~ 2^10,即10只小鼠可以测1000瓶水。


这道题在一些稍难的面试中出现了各种变体,例如如果可以测两轮,那么可以测多少瓶水中的一瓶毒药?


首先是第一轮死掉的小鼠不能被replace的情况,小鼠有三种状态,第一轮死,第二轮死,和两轮都没死,那么三种状态可以类比为3进制,小鼠的量程为3^10即59049瓶,具体操作方式为对编码为2的位数,第二轮混合喂。

然后是第一轮死掉的小鼠可以被replace的情况,将每1024瓶混合为1滴做第一轮,选定组别后第二轮确定瓶子编码,量程为2^10 * 2^10即1048576瓶。

对不能replace的N轮,量程为(N+1)^10,能replace的N轮,量程为2^(10*N)。


第二种变体,如果1000瓶里有2瓶毒药,需要多少只小鼠?


1000瓶里1瓶毒药有1000种可能性,而1000瓶2瓶毒药则有C(1000,2),即499500种可能性,那么log2(499500) 为18.93,即需要19只小鼠。具体实现方式为以两两混合法将1000瓶拆成499500滴,并用题目1中的方法测得。

那么对1000瓶中的N瓶毒药,则需要log2(C(1000,N))只小鼠,若N>=500,则取C(1000,1000-N)。


第三种变体,有16瓶水1瓶有毒,用多少只小白鼠能测出14瓶无毒的水?


将16瓶药水用二进制XXXX表示,取3只小白鼠来测,测出的状态为XXX,那么毒在XXX0或XXX1中,剩下14瓶无毒。

编辑于 2016-12-15

文章被以下专栏收录