📜  找到有毒桶所需的最小数量的猪

📅  最后修改于: 2021-04-17 18:42:29             🧑  作者: Mango

给定一个整数N,表示桶的数量,一个整数M ,表示猪喝毒后死亡所需的最短时间(以分钟为单位),任务是找到确定哪个桶有毒的最小数量的猪。 P分钟,如果恰好有一个装有毒药的水桶,其余的装满了水。

例子:

方法:可以使用给定的观察值解决给定的问题:

  • 可以允许一头猪在任意数量的桶上同时喝水,而且喂食没有时间。
  • 猪立即喝完水桶后,必须有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)