有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