1.问题描述:
1000只桶 = 1桶毒药水 + 999桶水,这些桶看起来别无二致,现以猪试毒,若一个猪喝了毒药水便会在15min死去,如果想在1小时找出这桶毒药水,那么最少需要多少头猪 ?
2.迁移老鼠试酒,确定猪的数量:
老鼠试酒也是用老鼠确定毒酒,不同的是它的要用10只老鼠在最短时间内找到毒酒(普通酒和毒酒可以混合并且假设老鼠醒酒的周期是T),做法是将1000杯酒转换为2进制的数,然后然后以老鼠的生死分别代表二进制的1和0,那么便可以在一个周期内试出毒酒,说了这么多你可能有些混乱,不用单担心让我们在代码中体会:
//用老鼠食药二进制思维进行计算
public static int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
//所要试的次数
float times = (float)Math.ceil((float)minutesToTest/(float)minutesToDie);
//每次需要试多少个
int number = (int)Math.ceil(buckets/times);
//用短除法,记录二进制的位数便为猪的个数
int pigs = 0;
while(number > 0){
number = (int)(number / 2);
pigs++;
}
return pigs;
}
程序的主要功能是为解决一类问题所提供的一种特定的思路,那么为解决所提出具体问题,传入实参buckets = 1000, minutesToDie = 15, minutesToTest = 60, 运行程序后所得答案:8 。长舒一口气以为这个问题已经解决的时候,突然看到了不可思议的一幕.....