Leetcode每日一题(困难)458. 可怜的小猪

在刚看到这个问题的时候,总是会去纠结其中有两个变量,小猪的数量和喂水的次数,但如果想要猪的数量最少,就要充分利用所有喂水的次数。

其实根据喂水的次数可以判断需要多少头小猪才能确认哪个桶里有毒,如

minutesToDie = 15, minutesToTest = 30, 则喂水的次数times = minutesToTest / minutesToDie = 2次,倘若只有一只猪,则最多可以确认三个桶里的水是否有毒,即喂水两次可以判断三个桶里的水是否有毒

时间pig1
0-15喂第一桶水判断第一桶水有无毒
15-30喂第二桶水判断第二桶水有无毒
判断第三桶水有无毒

再将猪的数量从1增加到2会变成什么样呢?

pig1/pig20-1515-30
0-15012
15-30345
678

其中,行代表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;
    }
};

此处少考虑了仅有一个桶的情况,因此将其加上即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值