1.毒药
有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
解决方法
步骤一:给这1000瓶标号:1,2,3,4,5,6…1000,并分别转化为2进制
1:0000000001
2:0000000010
3:0000000011
4:0000000100
......
1000:1111101000
1
2
3
4
5
6
步骤二:让第i只老鼠,喝掉所有二进制表示中第i位为1(位置:从右往左1,2,3..)的所有瓶子
例如:第2只老鼠要喝掉所有第2位为1的瓶子
#
2:0000000010
3:0000000011
6:0000000110
7:0000000111
......
1
2
3
4
5
6
步骤三:一个周期后查看哪些老鼠死了,第i只老鼠死了,说明毒药瓶子二进制的第i位是1(位置:从右往左1,2,3…),这样根据死了哪几只老鼠,就能得到二进制表示的哪几位是1了,进而最终可以得到毒药的标号
从上面的推导过程中可以看到,小白鼠的数量n即为瓶子总数N转化为二进制的最高位的位数,如1000:1111101000,最高位是10,所以最少需要10只小白鼠
总结
设n为小白鼠数量,N为瓶子数量,只要2^n > N就可以在一个周期内检验出哪个瓶子里有毒药
例如:N = 8(有 7 瓶是普通的水,有一瓶是毒药),则只需要3只小白鼠就可以在一个周期内检验出哪个瓶子里有毒药
2.赛马 64匹马找出前4名
1.首先把64匹马随机分成8组,分别进行8次比赛,记录成绩。
2.再将每组第一名集合起来进行一次比赛。这是第九次比赛。
3.留下第九次比赛前四名的马所在的组。因为对于后四名的马所在的组来说根据判断原则没有一匹有机会进入前四的。
4.剩下的四组按照每组第一名在第九次比赛的成绩排序,这样按照判断原则,只剩下10匹马(如下)可能进入前4,而第一组的第一名肯定是跑最快的马。
第一组: 1 2 3 4
第二组: 1 2 3
第三组: 1 2
第四组: 1
这样问题就变成9匹马找出前三快的。情况好的话跑一次可以得到,不行的话两次。
第一组: 2 3 4
第二组: 1 2 3
第三组: 1 2
第四组: 1
第一组:2 3 4 第二组:1 2 3第三组:1 2进行比赛,如果第三组:1为第三名,则第三组: 2与第四组:1跑一次决出第四名,共11场;否则第三组:1不为第三名不必再跑,共10场。所以结果是10或者11。
3.倒水问题:
3L和5L水桶各一个,怎样取4L的水?
3L倒入两次 剩1L
这1L倒入5L后,再倒入3L