给定一个整数N,表示桶的数量,一个整数M ,表示猪喝毒后死亡所需的最短时间(以分钟为单位),任务是找到确定哪个桶有毒的最小数量的猪。 P分钟,如果恰好有一个装有毒药的水桶,其余的装满了水。
例子:
Input: N = 1000, M = 15, P = 60
Output: 5
Explanation: Minimum number of pigs required to find the poisonous bucket is 5.
Input: N = 4, M = 15, P = 15
Output: 2
Explanation: Minimum number of pigs required to find the poisonous bucket is 2.
方法:可以使用给定的观察值解决给定的问题:
- 可以允许一头猪在任意数量的桶上同时喝水,而且喂食没有时间。
- 猪立即喝完水桶后,必须有M分钟的凉爽停机时间。在这段时间里,只允许观察,根本不喂食。
- 任何给定的存储桶都可以无限次采样(不限数量的猪)。
现在,要测试的时间是P分钟,死的时间是M分钟,这简单地说明了可以使用几轮的猪,即一头猪可以吃多少次。因此,声明一个变量,称为r = P(要测试的分钟数)/ M(要测试的分钟数) 。
考虑案例以了解方法:
情况1:如果r = 1,即回合数为1 。
示例: 4个桶,死15分钟,测试15分钟。答案是2。假设A和B代表2头猪,那么情况是:
显然,使用二进制形式将解决方案表示为:
结论:如果有x头猪,它们可以代表(编码) 2 x桶。
情况2:如果r> 1,即回合数大于1 。下面是以下符号:
- 0表示猪不喝酒也不死。
- 1表示在第一轮(也是唯一的一轮)中喝猪。
概括上述结果(T表示猪饮料在吨轮和模):如果有吨尝试,一个(T + 1)为基础的编号被用来表示(编码)的桶中。 (这也是为什么第一个结论使用基于2的数字的原因)
示例: 8个存储桶,15个存储桶要死,40个存储桶要测试。现在有2个 (=(40/15).floor) 因此,尝试使用基于3的数字对存储桶进行编码。所需的最小猪数为2 (= Math.log(8,3 ) .ceil )。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the minimum number of pigs
// required to find the poisonous bucket
void poorPigs(int buckets,
int minutesToDie,
int minutesToTest)
{
// Print the result
cout << ceil(log(buckets)
/ log((minutesToTest
/ minutesToDie)
+ 1));
}
// Driver Code
int main()
{
int N = 1000, M = 15, P = 60;
poorPigs(N, M, P);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Function to find the minimum number of pigs
// required to find the poisonous bucket
static void poorPigs(int buckets, int minutesToDie,
int minutesToTest)
{
// Print the result
System.out.print((int)Math.ceil(
Math.log(buckets)
/ Math.log((minutesToTest / minutesToDie)
+ 1)));
}
// Driver Code
public static void main(String[] args)
{
int N = 1000, M = 15, P = 60;
poorPigs(N, M, P);
}
}
// This code is contributed by Dharanendra L V.
Python3
# Python program for the above approach
import math
# Function to find the minimum number of pigs
# required to find the poisonous bucket
def poorPigs(buckets, minutesToDie, minutesToTest):
# Prthe result
print(math.ceil(math.log(buckets)\
// math.log((minutesToTest \
// minutesToDie) + 1)));
# Driver Code
if __name__ == '__main__':
N = 1000;
M = 15;
P = 60;
poorPigs(N, M, P);
# This code is contributed by 29AjayKumar
C#
// C# program for the above approach
using System;
class GFG
{
// Function to find the minimum number of pigs
// required to find the poisonous bucket
static void poorPigs(int buckets, int minutesToDie,
int minutesToTest)
{
// Print the result
Console.WriteLine((int)Math.Ceiling(
Math.Log(buckets)
/ Math.Log((minutesToTest / minutesToDie)
+ 1)));
}
// Driver Code
static public void Main()
{
int N = 1000, M = 15, P = 60;
poorPigs(N, M, P);
}
}
// This code is contributed by jana_sayantan.
5
时间复杂度: O(1)
辅助空间: O(1)