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 for winning the match and 1 point for losing. The task is to find the minimum number of matches the team needs to win in order to qualify for the 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++
#include <bits/stdc++.h>
using namespace std;
int findMinimum( int x, int y)
{
int low = 0, high = y;
while (low <= high) {
int mid = (low + high) >> 1;
if ((mid * 2 + (y - mid)) >= x)
high = mid - 1;
else
low = mid + 1;
}
return low;
}
int main()
{
int x = 6, y = 5;
cout << findMinimum(x, y);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int findMinimum( int x, int y)
{
int low = 0 , high = y;
while (low <= high)
{
int mid = (low + high) >> 1 ;
if ((mid * 2 + (y - mid)) >= x)
high = mid - 1 ;
else
low = mid + 1 ;
}
return low;
}
public static void main (String[] args)
{
int x = 6 , y = 5 ;
System.out.println(findMinimum(x, y));
}
}
|
Python 3
def findMinimum(x, y):
low = 0
high = y
while (low < = high):
mid = (low + high) >> 1
if ((mid * 2 + (y - mid)) > = x):
high = mid - 1
else :
low = mid + 1
return low
if __name__ = = '__main__' :
x = 6
y = 5
print (findMinimum(x, y))
|
C#
using System;
class GFG
{
static int findMinimum( int x, int y)
{
int low = 0, high = y;
while (low <= high)
{
int mid = (low + high) >> 1;
if ((mid * 2 + (y - mid)) >= x)
high = mid - 1;
else
low = mid + 1;
}
return low;
}
static public void Main()
{
int x = 6, y = 5;
Console.WriteLine(findMinimum(x, y));
}
}
|
PHP
<?php
function findMinimum( $x , $y )
{
$low = 0; $high = $y ;
while ( $low <= $high )
{
$mid = ( $low + $high ) >> 1;
if (( $mid * 2 + ( $y - $mid )) >= $x )
$high = $mid - 1;
else
$low = $mid + 1;
}
return $low ;
}
$x = 6; $y = 5;
echo findMinimum( $x , $y );
?>
|
Javascript
<script>
function findMinimum(x, y)
{
let low = 0, high = y;
while (low <= high) {
let mid = (low + high) >> 1;
if ((mid * 2 + (y - mid)) >= x)
high = mid - 1;
else
low = mid + 1;
}
return low;
}
let x = 6, y = 5;
document.write(findMinimum(x, y));
</script>
|
Time Complexity: O(log y), as we are using binary search in each traversal we are effectively reducing by half time, so the cost will be 1+1/2+1/4+…..+1/2^ywhich is equivalent to log y.
Auxiliary Space: O(1), as we are not using any extra space.
Last Updated :
16 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...