哪桶水有毒

有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在15分钟内死去。

如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?

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

分析

你现在拥有一头猪,这头猪去喝水,如果他喝了毒药,15分钟内它将死去,如果喝到没有毒的水15分种后他还活着,一个小时中,0分钟,15分钟,30分钟,45分钟时可以喝一次水,所以他共可以喝4次水。这样的话,他就拥有了5种状态0分钟 15分钟 30分钟 45分钟 60分钟,而并非是死或者活俩种状态。

问题

问题来了,那我们怎么才能够判断哪桶水有毒,且我们需要几头猪。所以我们简化了问题,我只有5桶水,答案不言而喻,使用一头猪喝四次 ,如果最后这头猪没有死,那留下那桶就是有毒的,如果喝水过程中死亡,那么喝的哪桶就是哪桶。5桶水比较简单,那1000桶又该怎么算呢?

解答

@@ 我们不妨先看看假如有25桶的情况

如下图,我们将桶如图方式摆放

我们要找到图中9号有毒的桶,我们使用俩头猪去喝水

在这里插入图片描述

我们让一头猪从第一行开始喝(标号为1,2,3,4,5)我们让第二头猪从第一列开始喝(标号为1,6,11,16,21)

在这里插入图片描述

15分钟后他们都没有死,让他们喝第二行和第二列,在15-30这个时间段里,负责喝行的猪死亡了。。。。,负责列的猪30分钟时还没死掉,接着喝- -!

在这里插入图片描述

负责列的猪45分钟没有死掉,所以45分钟时他接着向下喝,当45分-60分种时,负责列的猪也终于死去了,这是俩头猪分别死在了2行4列我们锁定了9号桶,最后我们得出他就是有毒那一桶。

在这里插入图片描述

假设猪都没死掉呢,那其实只有25号桶中的水没有被喝过,所以有毒的就是他了。(假设毒在25号)

在这里插入图片描述

进阶

由上面分析后,我们就明白了,1头猪可以喝5桶,2头可以喝25桶,那3头没错就是125桶,大家可以理解为一个3维空间,每一个猪都可以负责一个维度。所以我们在题目的基础上就可以知道4头猪可以测试625桶,5头可以测试3125>1000。我们得出5头就可以完成实验。那进阶的通用算法怎么实现?

60分钟/15分钟 = 4(理解为喝四次)但是我们可以测5桶,原因上面讲过了,留下的一桶也可以得出结果

当5的n次方大于我们要测试的桶数,n就是我们要的猪

代码

int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
    int k = minutesToTest / minutesToDie + 1;//求出是谁的次方
    for(int i = 0, max = 1;;i++, max *= k)//计算什么时候大于桶数跳出
    {
        if(max >= buckets)
        {
            return i;
        }
    }
}

ps:当然了,一头猪我们就不要去测试了哈哈
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lucky52529/article/details/85110278