LeetCode 可怜的小猪

有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。
问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?
回答这个问题,并为下列的进阶问题编写一个通用算法。
进阶:

假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有毒” 水桶?
这 n 只水桶里有且仅有一只有毒的桶。

提示:

可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
小猪喝完水后,必须有 m 分钟的冷却时间。在这段时间里,只允许观察,而不允许继续饮水。
任何给定的桶都可以无限次采样(无限数量的猪)。

思路分析: 假设只有1只小猪,60分钟的话,它最多可以判断出 60 / 15 + 1 = 5只水桶中的毒药桶。每隔十五分钟喝一次水,喝四次,如果幸运的话活了下来,就是最后一桶,否则就是喝死的那桶。
即小猪有 **15min之内死亡15 ~ 30min之内死亡30 ~ 45min之内死亡45 ~ 60min之内死亡一直活着**五种状态,分别代表1,2,3,4,5有毒。
再接着看2只小猪,60分钟,它最后可以判断出25只水桶,可以这样:

1	2	3	4	5
6	7	8	9	10
11	12	13	14	15
16	17	18	19	20
21	22	23	24	25

先将每一行混合给第一只猪喝,同样是有上面五种状态,即可以确定毒水所在的行,扫描行的同时,扫描列,将每一列混合给第二只猪喝,第二只猪也有5种状态,可以确定毒水所在的列。
当给定125只猪的时候,将它分成5 * 5 * 5的立方体,只要三只猪就能完成测试,第一只猪扫描长,第二只猪扫描宽,第三只猪扫描高。
规律:
猪的状态数status = 题目要求的时间 / 猪死亡的时间 + 1
猪的数目res 满足status res >= n(水的桶数)

class Solution {
public:
    int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        //猪的状态数
        int status = minutesToTest / minutesToDie + 1, result = 0;
        while (pow(status, result) < buckets){//寻找满足条件的res
            result += 1;
        }
        return result;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/88906996