【leetcode前500】458. 可怜的小猪

这是一道纯数学分析题,首先我们考虑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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值