1000瓶水其中有一瓶水有毒,有10只老鼠并且只要老鼠喝了有毒的水必死。请问怎样通过一次实验找出有毒的那瓶水。
. 这道题知识点:二进制。
解题思路:2的10次方等于1024,1024以内的所有自然数都可以用10个数位的二进制数表示出来。1000 <= 1024,此题可解。
第一步:将1000瓶水从water[0]到water[999]分别进行编号,并转化成10个数位的二进制数表示如下:
第二步:将10只老鼠从mouse[0]到mouse[9]进行编号
0.让第mouse[0]只老鼠喝第0位为1的所有的水
1.让第mouse[1]只老鼠喝第1位为1的所有的水
2.让第mouse[2]只老鼠喝第2位为1的所有的水
.
.
.
8.让第mouse[8]只老鼠喝第8位为1的所有的水
9.让第mouse[9]只老鼠喝第9位为1的所有的水
这样就保证了(除了第0瓶水外)每一瓶水都有老鼠喝了。
第三步:根据老鼠的存活情况判定有毒水方法
if(如果第i只老鼠死了) 则让 water[第i位1的水的编号]的值-1.
else 则让 water[第i位1的水的编号]的值+1.
然后找出wanrer[0]--water[999] 中 的最小数water[i],
if(water[i] <0) 即为 第 i 瓶水有毒 else 为第0瓶水有毒。
原因:因为water[0]--water[999]的初始值都为0,如果第i只老鼠死了,说明第mouse[i]只老鼠喝的水中必有一瓶有毒,所以令 water[第i位1的水的编号]的值各-1.如果第i只老鼠没有死,说明第mouse[i]只老鼠喝的水都没有毒,所以令 water[第i位1的水的编号]的值各+1。
import java.util.Arrays;
import java.lang.StringBuilder;
import java.util.Scanner;
public class toxicWater {
public static final int waterNumber = 1000;//水的数目
public static final int mouseNumber =