LeetCode 每日一题 458. 可怜的小猪

题目描述

buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有 minutesToTest 分钟时间来确定哪桶液体是有毒的。

来源:力扣(LeetCode)
喂猪的规则如下:

  1. 选择若干活猪进行喂养
  2. 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
  3. 小猪喝完水后,必须有 minutesToDie 分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。
    过了 minutesToDie 分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。
    重复这一过程,直到时间用完。
    给你桶的数目 bucketsminutesToDieminutesToTest,返回在规定时间内判断哪个桶有毒所需的 最小 猪数。

Solution

最优解法为,将所有的猪按照某进制编号,得到一个数字,每头猪确定这个数字的某一位即可。
这个进制数字怎么找呢?
cnt = minutesToTest / minutesToDie
显然我们的 \(猪的数量+1\) 就是我们的进制(base)。 然后我们可以得到的 最大的液体数量的范围为 \(ans \le base ^ {cnt}\)
因此ans = ceil(log(buckets) / log(base));

AC_CODE

class Solution {
public:
    int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        int cnt = minutesToTest / minutesToDie;
        return ceil(log(buckets) / log(cnt + 1));
    }
};
posted @ 2021-11-25 08:44  ccz9729  阅读(52)  评论(2编辑  收藏  举报