LeetCode.458. 可怜的小猪

有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在15分钟内死去。

问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?

回答这个问题,并为下列的进阶问题编写一个通用算法。

进阶:

假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出“有毒”水桶?n只水桶里有且仅有一只有毒的桶。

思路:

  • 首先需要确定的是死亡时间是15分钟【内】,即判断一桶水究竟是否有毒需要等到15分钟时才可确定,因此这15分钟内不可再喝别桶水。
  • 分析简单示例。一只猪在测试时间内可能有5种情况。15分钟时死亡,30分钟时死亡,45分钟时死亡,60分钟时死亡,60分钟时存活。因此一只猪最多可以判断5桶水。
  • 两只猪则最多可以判断25桶水。将25桶水进行二维矩阵xy坐标编码,每行分别混合,产生5桶水,一只猪来求毒药的x坐标;同理每列分别混合产生5桶水,用于给另一只猪求毒药的y坐标。
  • 同理可知,n只猪最多可以判断5^n桶水。将水进行n维编码,每只猪都进行毒药桶的一个坐标求解。
  • 开始处理进阶。每只猪可以测试的水桶数量为x=【总时间//死亡时间+1】,这样最多可以判断x^n桶水,逐渐增大n使其大于水桶数量即可。

代码:

class Solution(object):
    def poorPigs(self, buckets, minutesToDie, minutesToTest):
        """
        :type buckets: int
        :type minutesToDie: int
        :type minutesToTest: int
        :rtype: int
        """
        times=minutesToTest//minutesToDie+1
        num=0
        while times**num<buckets:
            num+=1
        return num
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值