声明:
今天是第105道题。有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在15分钟内死去。问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在15分钟内死去。问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?回答这个问题,并为下列的进阶问题编写一个通用算法。
进阶:
假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出“有毒”水桶?n只水桶里有且仅有一只有毒的桶。
解法1。1只小猪最多可以测试p/m次,可以检测p/m+1桶水(+1是因为给定的水里必有毒,虽然只能测p/m次,但剩下1桶不证自明);2只小猪可以分为x-y二维坐标系,1只负责x轴,1只负责y轴,从左下角开始试,最多可以试(p/m+1)^2桶水,那么同理,推广到n只猪,就是n维坐标系,总结一下规律如下。那么反过来已知桶数求最少的猪就很好求了,代码如下。
- 1只猪:p/m+1桶水
- 2只猪:(p/m+1)^2桶水
- 3只猪:(p/m+1)^3桶水
- ……
- n只猪:(p/m+1)^n桶水
执行用时: 24 ms, 在Poor Pigs的Python提交中击败了89.80% 的用户
class Solution(object):
def poorPigs(self, buckets, minutesToDie, minutesToTest):
"""
:type buckets: int
:type minutesToDie: int
:type minutesToTest: int
:rtype: int
"""
fold = minutesToTest / minutesToDie + 1
i = 0 # 注意这里i从0开始
while buckets > pow(fold,i):
i += 1
return i
# 其实上面这段代码可以简化成一句:
import math
return int(math.ceil(math.log(buckets,fold)))
结尾
解法1:https://blog.youkuaiyun.com/gleam_/article/details/80251769
解法竟是如此地一致,LeetCode上提交的思路都是这样的,就是代码风格不同~