没有输出的输入是不完整的

0%

MouseAndPoison

最近有和同学在讨论用小老鼠来找出有毒的水瓶的问题,稍微总结一下。

经典问题. 16选1

16瓶水其中有一瓶有毒,多少个小老鼠可以确定是哪瓶呢?

1. 二进制编码水瓶

对16瓶水进行二进制编码,比如第五瓶是1001,那么就给第一只和第四只小老师喝(第n只代表从低位到高位的序号),这样最终死亡的小老鼠就会拼凑出一个数字就是对应的有毒的那一瓶水。比如说第一只和第三只小老鼠死了,那么就是0101,所以也就是第五瓶水有毒。

2. 减半查找

如果不考虑时间,我们可以一次一次小鼠进行测试,每次找出奇数位的小鼠,可以通过死亡与否确定是奇数还是偶数,每次都可以将等待判断的量降低为原来的一半。所以总共需要log2(n)向上取整只小鼠。

3. 上面两种方式等价。

其实上面两种方法等价,最高位是1去掉所有的一半,次高位是1去掉一半,最后就剩两个,然后再来一只小鼠就确定了。

变体问题

  1. 如果10-17瓶水只有一瓶水有毒,同样可以按照1的方式进行计算。
  2. 如果16瓶水,其中有一瓶是有毒的,要找14瓶没毒的,实际上就可以变相的理解为8瓶水中找7瓶,从而只需要三只小老鼠就可以了。
  3. 如果允许有两轮,或者变相说明有一个小时时间,然后小鼠喝毒药半个小时就去世,那就可以理解成为需要一轮然后处理一半的水瓶就可以了。

如果以后还有再继续补充吧~