如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?
进阶:假设有 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头就可以完成实验。那进阶的通用算法怎么实现?
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;
}
}
}