Minimum matches the team needs to win to qualify

Given two integers X and Y where X denotes the number of points required to qualify and Y denotes the number of matches left. The team receives 2 points on winning the match and 1 point on losing. The task is to find the minimum number of matches the team needs to win in order to qualify for next round.

Examples:

Input: X = 10, Y = 5
Output: 5
The team needs to win all the matches in order to get 10 points.



Input : X = 6, Y = 5
Output : 1
If the team wins a single match and loses the rest 4 matches, they would still qualify.

A naive approach is to check by iterating over all values from 0 to Y and find out the first value which gives us X points.

An efficient approach is to perform a binary search on the number of matches to be won to find out the minimum number of the match. Initially low = 0 and high = X, and then we check for the condition (mid * 2 + (y – mid)) ≥ x. If the condition prevails, then check if any lower value exists in the left half i.e. high = mid – 1 else check in the right half i.e. low = mid + 1.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the minimum number of
// matches to win to qualify for next round
int findMinimum(int x, int y)
{
  
    // Do a binary search to find
    int low = 0, high = y;
    while (low <= high) {
  
        // Find mid element
        int mid = (low + high) >> 1;
  
        // Check for condition
        // to qualify for next round
        if ((mid * 2 + (y - mid)) >= x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}
  
// Driver Code
int main()
{
    int x = 6, y = 5;
    cout << findMinimum(x, y);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.io.*;
  
class GFG 
{
      
// Function to return the minimum number of
// matches to win to qualify for next round
static int findMinimum(int x, int y)
{
  
    // Do a binary search to find
    int low = 0, high = y;
    while (low <= high)
    {
  
        // Find mid element
        int mid = (low + high) >> 1;
  
        // Check for condition
        // to qualify for next round
        if ((mid * 2 + (y - mid)) >= x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}
  
// Driver Code
public static void main (String[] args) 
{
    int x = 6, y = 5;
    System.out.println(findMinimum(x, y));
}
}
  
// This code is contributed by ajit.

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of the approach
  
# Function to return the minimum number of
# matches to win to qualify for next round
def findMinimum(x, y):
      
    # Do a binary search to find
    low = 0
    high = y
    while (low <= high):
          
        # Find mid element
        mid = (low + high) >> 1
  
        # Check for condition
        # to qualify for next round
        if ((mid * 2 + (y - mid)) >= x):
            high = mid - 1
        else:
            low = mid + 1
    return low
  
# Driver Code
if __name__ == '__main__':
    x = 6
    y = 5
    print(findMinimum(x, y))
      
# This code is contributed by 
# Surendra_Gangwar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG
{
          
// Function to return the minimum number of
// matches to win to qualify for next round
static int findMinimum(int x, int y)
{
  
    // Do a binary search to find
    int low = 0, high = y;
    while (low <= high)
    {
  
        // Find mid element
        int mid = (low + high) >> 1;
  
        // Check for condition
        // to qualify for next round
        if ((mid * 2 + (y - mid)) >= x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}
  
// Driver code
static public void Main()
{
    int x = 6, y = 5;
    Console.WriteLine(findMinimum(x, y));
}
}
  
// This Code is contributed by ajit.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
  
// Function to return the minimum number of
// matches to win to qualify for next round
function findMinimum($x, $y)
{
  
    // Do a binary search to find
    $low = 0; $high = $y;
    while ($low <= $high
    {
  
        // Find mid element
        $mid = ($low + $high) >> 1;
  
        // Check for condition$
        // to qualify for next round
        if (($mid * 2 + ($y - $mid)) >= $x)
            $high = $mid - 1;
        else
            $low = $mid + 1;
    }
    return $low;
}
  
// Driver Code
$x = 6; $y = 5;
echo findMinimum($x, $y);
  
// This code has been contributed
// by 29AjayKumar
?>

chevron_right


Output:

1

Time Complexity: O(log y)



My Personal Notes arrow_drop_up

Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.