有趣的算法-老鼠毒药问题

问题描述

有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

问题分析

这个题目需要面对几个问题

  1. 因为毒药会在一个星期后生效,而只有一星期的时间,那么只能让老鼠多喝几瓶最后根据老鼠中毒情况判断出哪一瓶有毒
  2. 要喝完这一千瓶,那么每只老鼠要喝很多,如果老鼠们喝的不交叉,那么即使老鼠中毒,也无法区分它喝的哪一瓶有毒
  3. 如果它们喝的有交叉,就需要每一瓶都存在部分老鼠喝了部分老鼠没有喝,且每一瓶喝与不喝的老鼠都不一样

使用二进制思想(当时就是没想到)

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的老鼠都没有事情

参考文档

  1. https://blog.csdn.net/qq_43827595/article/details/104154716