有1000个桶,有且仅有一个桶里面装了毒药,其他的都装了水。这些桶从外面看上去完全相同。如果一只猪喝了毒药,它将在15分钟内死去。在一个小时内,至少需要多少只猪才能判断出哪一个桶里装的是毒药呢?
思考回答这个问题,随后请设计实现一个算法去处理更一般的情况。
样例1:
输入: buckets = 1000; minutesToDie = 15; minutesToTest = 60
输出: 5
挑战
假如一共有 n 个桶,只有一个桶装了毒药。一只猪将在喝完毒药 m 分钟后死去。你需要多少只猪才能在 p 分钟内找出那个装毒药的桶呢?
思路:
假设5桶酒,时间为题目所设,只要一头猪就可以完成测试,第一轮第一桶酒,第二轮第二桶…若猪幸存,则第五桶酒为毒酒,故minutestotest/minutesrodie+1为可以测试的次数,因最后一次无需测试。
假设有25桶酒
00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44
需要两头猪,
第一轮:一头猪第一行,另一头第一列,如果都毒死,则是在交叉点,否则剩下四桶酒可能是毒酒,剩余时间刚好测试四轮,一头猪可以测完。
第二轮:一头猪第二行,另一头第二列,同样道理,如果一头猪死亡,则剩下三桶酒未测试,而测试时间也为3次。后面以此类推。
所以需要猪数为测试的时间数的n次方不小于酒桶数,此时的n即为所需要的猪的数量。
class Solution {
public:
/**
* @param buckets: an integer
* @param minutesToDie: an integer
* @param minutesToTest: an integer
* @return: how many pigs you need to figure out the "poison" bucket within p minutes
*/
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
// Write your code here
int num=minutesToTest/minutesToDie+1;
if(buckets==1) return 0;
int pig=1;
while(pow(num,pig)<buckets)pig++;
return pig;
}
};