Open In App

Rat and Poisoned bottle Problem

Last Updated : 02 Jul, 2025
Comments
Improve
Suggest changes
14 Likes
Like
Report

Given N number of bottles in which one bottle is poisoned. So the task is to find out the minimum number of rats required to identify the poisoned bottle. A rat can drink any number of bottles at a time and if any of the taken bottles is poisonous, then the rat dies and cannot drink anymore.

Examples:

Input: N = 4
Output: 2
Explanation: The minimum number of rats needed to find the poisoned bottle among 4 bottles is 2, using binary representation.

Input: N = 100
Output: 7
Explanation: Since 2⁷ = 128 can cover up to 100 bottles, a minimum of 7 rats is required for identification.

Input: N = 1000
Output: 10
Explanation: The minimum number of rats required is 10, as 210 = 1024 can uniquely identify one poisoned bottle among 1000.

Approach: 

Let's start from the base case.

  • For 2 bottles: Taking one rat (R1). If the rat R1 drinks the bottle 1 and dies, then bottle 1 is poisonous.
    Else the bottle 2 is poisonous. Hence 1 rat is enough to identify.
  • For 3 bottles: Taking two rats (R1) and (R2). If the rat R1 drinks the bottle 1 and bottle 3 and dies, then bottle 1 or bottle 3 is poisonous. So the rat R2 drinks the bottle 1 then. If it dies, then the bottle 1 is poisonous, Else the bottle 3 is poisonous. 
    Now if the rat R1 does not die after drinking from bottle 1 and bottle 3, then bottle 2 is poisonous. 
    Hence 2 rats are enough to identify.  
  • For 4 bottles: Taking two rats (R1) and (R2). If the rat R1 drinks the bottle 1 and bottle 3 and dies, then bottle 1 or bottle 3 is poisonous.
    So the rat R2 drinks the bottle 1 then. If it dies, then the bottle 1 is poisonous, Else the bottle 3 is poisonous. 
    Now if the rat R1 does not die after drinking from bottle 1 and bottle 3, then bottle 2 or bottle 4 is poisonous.
    So the rat R1 drinks the bottle 2 then. If it dies, then the bottle 2 is poisonous, Else the bottle 4 is poisonous. 
    Hence 2 rats are enough to identify.  
  • For N bottles: Minimum number of rats required are = ceil(log2 N).
rat-and-poisioned
C++
// C++ program to implement
// the above approach

#include <bits/stdc++.h>
using namespace std;

// Function to find the minimum number of rats
int minRats(int n)
{
    return ceil(log2(n));
}

// Driver Code
int main()
{
    // Number of bottles
    int n = 1025;

    cout << "Minimum " << minRats(n)
         << " rat(s) are required"
         << endl;

    return 0;
}
Java
// Java program to implement 
// the above approach
class GFG
{
    public static double log2(int x)
    {
        return (Math.log(x) / Math.log(2));
    }

    // Function to find the minimum number of rats 
    static int minRats(int n) 
    { 
        return (int)(Math.ceil(log2(n))); 
    } 
    
    // Driver Code 
    public static void main (String[] args) 
    { 
        // Number of bottles 
        int n = 1025; 
    
        System.out.println("Minimum " + minRats(n) + 
                           " rat(s) are required"); 
    }    
} 
Python
# Python3 program to implement 
# the above approach 
import math

# Function to find the 
# minimum number of rats 
def minRats(n):
    
    return math.ceil(math.log2(n)); 

# Driver Code 

# Number of bottles 
n = 1025; 
print("Minimum ", end = "")
print(minRats(n), end = " ")
print("rat(s) are required")
C#
// C# program to implement 
// the above approach
using System;

class GFG
{
    public static double log2(int x)
    {
        return (Math.Log(x) / Math.Log(2));
    }

    // Function to find the minimum number of rats 
    static int minRats(int n) 
    { 
        return (int)(Math.Ceiling(log2(n))); 
    } 
    
    // Driver Code 
    public static void Main (String[] args) 
    { 
        // Number of bottles 
        int n = 1025; 
    
        Console.WriteLine("Minimum " + minRats(n) + 
                          " rat(s) are required"); 
    } 
}
JavaScript
// Javascript program to implement
// the above approach

// Function to find the minimum number of rats
function minRats(n)
{
    return Math.ceil(Math.log2(n));
}

// Driver Code

// Number of bottles
var n = 1025;
console.log("Minimum " + minRats(n) + 
               " rat(s) are required");
               

Output
Minimum 11 rat(s) are required

Time Complexity: O(1)
Auxiliary Space: O(1)



Article Tags :

Explore