在刚看到这个问题的时候,总是会去纠结其中有两个变量,小猪的数量和喂水的次数,但如果想要猪的数量最少,就要充分利用所有喂水的次数。
其实根据喂水的次数可以判断需要多少头小猪才能确认哪个桶里有毒,如
minutesToDie = 15, minutesToTest = 30, 则喂水的次数times = minutesToTest / minutesToDie = 2次,倘若只有一只猪,则最多可以确认三个桶里的水是否有毒,即喂水两次可以判断三个桶里的水是否有毒
时间 | pig1 | |
0-15 | 喂第一桶水 | 判断第一桶水有无毒 |
15-30 | 喂第二桶水 | 判断第二桶水有无毒 |
判断第三桶水有无毒 |
再将猪的数量从1增加到2会变成什么样呢?
pig1/pig2 | 0-15 | 15-30 | |
0-15 | 0 | 1 | 2 |
15-30 | 3 | 4 | 5 |
6 | 7 | 8 |
其中,行代表pig1喝的混合水,列代表pig2喝的混合水,假设有毒的桶为第四个,则会体现在第二次喂了pig1,pig2后,两只猪都死亡。通过此种方法,则可以判定出哪个桶里的水有毒。
当times为2,猪为一只时,能判断出桶的数量为times+1,当猪增加为两只时,能判断出的桶的数量为pow(3,2),也就是3的平方,九个桶,以此类推,猪为三只时,上述矩阵变为三维,可以判断3^3=27个桶。当buckets桶数大于pow(times+1,pig数)时,则继续增加pig的数量。代码如下所示:
class Solution {
public:
int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
int times = minutesToTest / minutesToDie;
int pig = 1;
if(buckets == 1){
return 0;
}
while(buckets > pow(times+1,pig)){
pig++;
}
return pig;
}
};
此处少考虑了仅有一个桶的情况,因此将其加上即可。