458.可怜的小猪
题目描述
思路
数学
使用n代指多少桶水,d为实验对象的反应时间,t为测试总时间。
根据题意,最大测试次数为k=t/d。
考虑k=1的情况,最简单的情况是,使用与水同等数量的实验对象数量来进行测试。此时哪个实验对象有反应,则可以推断出哪一桶水有问题。
但是这样的测试方法是低效的,每个实验对象仅承载了一桶水是否有问题。
为减少实验对象数量,每个实验对象需要测试多桶水,然后从最终所有实验对象的状态来推测哪一桶水有问题。
而通过递推关系,可以发现当k=j,i个实验对象可以判断的最大桶数为
(
j
+
1
)
i
(j+1)^i
(j+1)i。
Java实现
class Solution {
public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
int states = minutesToTest / minutesToDie + 1;
int pigs = (int) Math.ceil(Math.log(buckets) / Math.log(states));
return pigs;
}
}
Python实现
class Solution:
def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:
states = minutesToTest // minutesToDie + 1
return ceil(log(buckets) / log(states))