1,题目要求
There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. They all look the same. If a pig drinks that poison it will die within 15 minutes. What is the minimum amount of pigs you need to figure out which bucket contains the poison within one hour.
Answer this question, and write an algorithm for the follow-up general case.
Follow-up:
If there are n buckets and a pig drinking poison will die within m minutes, how many pigs (x) you need to figure out the “poison” bucket within p minutes? There is exact one bucket with poison.
有1000个水桶,其中一个只有一个含有毒药,其余的都装满了水。 它们看起来都一样。 如果猪喝了那种毒药,它会在15分钟内死亡。 你需要在一小时内找出哪个桶中含有毒药的最小猪量是多少。
2,题目思路
对于这道题,很像以前的一个国王要求奴隶尝酒并找出毒酒一样。区别在于,这道题有喝完的死亡时间以及需要在规定的时间内完成检测,因此在这道题中,猪猪就可以重复利用:
即,假如一头猪在15分钟内喝完毒药会死,但是因为一共有1个小时的时间,因此,在这一个小时中,猪一共可以尝4排或者4列,也即,一头猪可以负责4行或4列,于是可以探测出5行或者5列是否有毒。
因此,两头猪就可以负责5 * 5 = 25个桶的水,同样的,3头猪就可以负责5 * 5 * 5 = 125个桶的水(可以想象为一个立方的矩阵),依次类推。
3,程序源码
class Solution {
public:
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
//因为有最小时间的存在,因此一只猪可以用多次(即重复使用,只要不死),这样可以减少猪的使用数量
int pigs = 0;
while(pow(minutesToTest/minutesToDie+1, pigs) < buckets)
pigs++;
return pigs;
}
};