这是一道纯数学分析题,首先我们考虑minToDie和minToTest,这两个表明了可用的“批次”。
比如示例1,p=60/15=4,说明我们可以用n头猪,测试p=4次。
不妨假设毒药总是在最后一桶,而且测试总是从小到大开始测试。
假设n=1,也就是仅有一头猪,测试p=4次,可能的结果是:
1.第一次测试就中毒;
2.躲过第一次,第二次中毒;
3.躲过第二次,第三次中毒;
4.躲过第三次,第四次中毒;
5.躲过第四次,依然存活。
那么对于这一只猪可能有五种状态,s=p+1。
接下来考虑仅测试一次的情况,n头猪能够测试多少桶水,这个问题是一个经典的二进制问题,比如有8桶水那么二进制分别是000,001....111一共8种:
一头猪(A)喝最后一位为1的桶,001,011,101,111
一头猪(B)和倒数第二位为1的桶,010,011,110,111
一头猪(C)和倒数第三位为1的桶,100,101,110,111
打个比方,B猪和C猪死了。那么110=6号有毒。因此n头猪能够欧测试2**n桶。
这样结合上面假设只有一头猪的情况。可以得到s**n为可测的桶数。
最终要求s**n>=buckets
我们要求的是n,也就是n>=log(buckets)/log(s)。
class Solution:
def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:
s=minutesToTest//minutesToDie+1
return ceil(math.log(buckets)/math.log(s))