星星之火-用小白鼠找毒药

本文最后更新于:December 3, 2021 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

描述

有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,给你24小时时间,至少要多少只小白鼠才可以试出哪瓶有毒?

答案

10只。(1000(1111101000),1000的二进制位有10位数字。)

思路

这是一个二进制的问题,利用二进制的位数进行统计。首先210 = 1024 > 1000,所以需要10位二进制位来表示1到1000。

给1000瓶水分别标号1-1000。再将其十进制数字转化为二进制,如下:

1
2
3
4
5
0000000001 (第1瓶) 
0000000010 (第2瓶)
0000000011 (第3瓶)
......
1111101000 (第1000瓶)

再去找每一瓶水的标号的二进制位中有为1的位置(从右向左以1开始),如下:

1
2
3
4
5
0000000001 (第1瓶) 1
0000000010 (第2瓶) 2
0000000011 (第3瓶) 1 2
......
1111101000 (第1000瓶) 4 6 7 8 9 10

即,第一瓶给编号为1的老鼠喝,第二瓶给编号为2的老鼠喝,第三瓶给编号为1、2的老鼠喝,··· 第1000瓶给编号为4、6、7、8、9、10的老鼠喝。喝了白水再喝毒水或者喝了毒水再喝白水是对最后结果没有影响的。
因为瓶的标号的二进制是从右向左开始计数的,所以老鼠的编号也应该从右向左排,即从10号排到1号,即:10 9 8 7 … 2 1。(因为10只老鼠就相当于是一个10位的二进制位,每一只老鼠是一个二进制位。)

在24小时后,查看10只老鼠的情况,死的表示为1活着的表示为0

假如:有毒的水为瓶标号为5号。则10只老鼠的情况为:

1
2
老鼠编号 10 9 8 7 6 5 4 3 2 1
0 0 0 0 0 0 0 1 0 1

将其二进制转化为10进制后即为答案5。

因为瓶标号为5(0000000101)的水会给1、3号老鼠喝,而喝完24小时后老鼠会死亡,而其他老鼠喝其他的没有影响。

同理:如果有毒的水为瓶标号为1000号。则10只老鼠的情况为:

1
2
老鼠编号 10 9 8 7 6 5 4 3 2 1
1 1 1 1 1 0 1 0 0 0

将其二进制转化为10进制后即为答案1000。