问题描述
有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
问题分析
这个题目需要面对几个问题
- 因为毒药会在一个星期后生效,而只有一星期的时间,那么只能让老鼠多喝几瓶最后根据老鼠中毒情况判断出哪一瓶有毒
- 要喝完这一千瓶,那么每只老鼠要喝很多,如果老鼠们喝的不交叉,那么即使老鼠中毒,也无法区分它喝的哪一瓶有毒
- 如果它们喝的有交叉,就需要每一瓶都存在部分老鼠喝了部分老鼠没有喝,且每一瓶喝与不喝的老鼠都不一样
使用二进制思想(当时就是没想到)
10个老鼠相当于10位的二进制位,可以表达的最大数量为1024
老鼠 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
如果给瓶子从1开始编号到1000,那么根据数字的二进制位,如果位数上是1的对应的老鼠就要喝掉这一瓶。根据老鼠的生存情况,就可以推断出哪一瓶有毒,假如:500是有毒的,那么它的二进制为 0111110100
那么,
老鼠 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
500 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
508 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
510 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
512 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
也就是说:第2、3、4、5、6、8只老鼠会死掉。而喝了508,510、512的老鼠都没有事情