458. 可怜的小猪
可怜的小猪
- 题目描述
- 尝试做法
- 题目理解
题目描述
有 buckets 桶液体,其中 正好有一桶 含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有 minutesToTest 分钟时间来确定哪桶液体是有毒的。
喂猪的规则如下:
选择若干活猪进行喂养
可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
小猪喝完水后,必须有 minutesToDie 分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。
过了 minutesToDie 分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。
重复这一过程,直到时间用完。
给你桶的数目 buckets ,minutesToDie 和 minutesToTest ,返回 在规定时间内判断哪个桶有毒所需的 最小 猪数 。
示例 1:
输入:buckets = 1000, minutesToDie = 15, minutesToTest = 60
输出:5
示例 2:
输入:buckets = 4, minutesToDie = 15, minutesToTest = 15
输出:2
示例 3:
输入:buckets = 4, minutesToDie = 15, minutesToTest = 30
输出:2
提示:
1 <= buckets <= 1000
1 <= minutesToDie <= minutesToTest <= 100
尝试做法
class Solution {
public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
int times = minutesToTest/minutesToDie,ans = 0;
while(Math.pow(times + 1, ans) < buckets) ++ans;
return ans;
}
}
实话实说,看了提示(Find minimum x such that (T+1)^x >= N)才做出来的。
最开始用Math.log时,发现log125 / log5没有通过,应该是小数精确度的问题。
题目理解
这里贴一下题目的一种理解方式
一只小猪代表一个维度(设为n), 每只小猪可以测试的次数+1为这只小猪在本维度上可以确定的点的数量(设为s),
则组成的n维空间中的总的点的数量为 s^n .小猪喝水策略: 把所有的水桶排成一个n维的n方体, 每只小猪喝垂直于本维度(轴)的一个"超平面".
如2只小猪, 5个点. 25桶水排成一个矩形, 一只喝行, 一只喝列. 2只小猪确定一个点(***).
如3只小猪, 5个点. 125桶水排成一个立方体, 一只喝垂直于x轴的面, 一只喝垂直于y轴的面, 一只喝垂直于z轴的面.
3只小猪确定一个点(***).如n只小猪, 5个点. 5^n桶水排成一个n方体, 每只喝垂直于本维度的一个"超平面"上的所有的水.
n只小猪确定n维空间中的一个点(***).
引用自https://leetcode.cn/problems/poor-pigs/solutions/15770/hua-jie-suan-fa-458-ke-lian-de-xiao-zhu-by-guanpen/comments/905588/