找出毒药
一、8瓶药里1瓶毒药,至少需要多少老鼠
老鼠找出毒药的一般问题类型是m瓶药,其中一瓶是毒药,用n只老鼠来检测,求n最小多少。
问题的最小规模是8瓶药,3只老鼠。明面和暗含的条件有
- m瓶药里只有一瓶毒药;
- 毒药立马发作;
- 所有老鼠同时喝药;
答案是2^3=8,故3只老鼠即可。具体方案是:瓶子0-7号(0号瓶所有老鼠都不喝。如果M1 M2 M3都没死,那0号就是毒药):
- 鼠M1: 1+3+5+7
- 鼠M2: 2+3+6+7
- 鼠M3: 4+5+6+7
方案的本质是,每只老鼠都喝4瓶药,且任意两只老鼠喝的药有且只有2瓶是一样的。所以下面方案也可以:
- 鼠M1: 0+1+4+5
- 鼠M2: 0+2+4+6
- 鼠M3: 0+3+5+6
- 鼠M1: 1+4+5+7
- 鼠M2: 2+4+6+7
- 鼠M3: 3+5+6+7
- 鼠M1: 1+4+6+7
- 鼠M2: 2+4+5+7
- 鼠M3: 3+6+5+7
- 鼠M1: 1+4+6+0
- 鼠M2: 2+4+5+0
- 鼠M3: 3+6+5+0
采用二进制来理解的方案,图示如下:
表1:
鼠↓ 瓶→ | 0号 | 1号 | 2号 | 3号 | 4号 | 5号 | 6号 | 7号 |
---|---|---|---|---|---|---|---|---|
鼠M1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
鼠M2 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
鼠M3 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
二、1000瓶药里1瓶毒药,喝药15分见效,总共60分种,至少需要多少老鼠
如果按前面的思路,一次性找出毒药需要 $\lceil \log_2{1000} \rceil$=10只老鼠没问题,可是60分钟内找出的毒药该如何解?我们可以使用n维坐标系分析,或者使用n进制给瓶子编号,这里的n指的是喝药次数+1。
采用三进制来理解的方案,图示如下:
表2:
鼠↓ 瓶→ | 0号 | 1号 | 2号 | 3号 | 4号 | 5号 | 6号 | 7号 | 8号 |
---|---|---|---|---|---|---|---|---|---|
鼠M1 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 |
鼠M2 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
从上面可以推测出,n瓶药里有1瓶毒药,喝药见效时间pt,总时间t,需要老鼠的通用公式为:
喝的轮数 c = $\lfloor t/pt \rfloor$
需要老鼠 m = $\lceil \log_{c+1}{n} \rceil$
三、1000瓶药里1瓶毒药,喝药15分见效,总共60分种,用最少的老鼠写出老鼠喝药的具体方案
从表2可以得出,正常情况下(最后一轮才出现老鼠死亡的情况)喝药方案:
表2:
第一轮 | 第二轮 | |
---|---|---|
M1 | 0+3+6 | 1+4+7 |
M2 | 0+1+2 | 3+4+5 |
如果中途出现老鼠死亡,剩下的老鼠去喝可能导致死亡的药即可(递归)。
喝药方案代码如下,考虑到中途可能有减员,故只给出了前两轮喝药方案:
1 |
|
三、1000瓶药里2瓶毒药,喝药15分见效,总共60分种,用最少的老鼠写出老鼠喝药的具体方案
todo