Given two integers W and C, representing the number of watermelons and coins, the task is to find the maximum number of mangoes that can be bought given that each mango costs 1 watermelon and X coins and y coins can be earned selling a watermelon.
Examples:
Input: W = 10, C = 10, X = 1, Y = 1
Output: 10
Explanation: The most optimal way is to use 10 watermelons and 10 coins to buy 10 mangoes. Hence, the maximum number of mangoes that can be bought is 10.Input: W = 4, C = 8, X = 4, Y = 4
Output: 3
Explanation: The most optimal way is to sell one watermelon. Then, the number of coins increases by 4. Therefore, the total number of coins becomes 12. Therefore, 3 watermelons and 12 coins can be used to buy 3 mangoes. Hence, the maximum number of mangoes that can be bought is 3.
Approach: This problem can be solved using binary search. The idea is to find the maximum number of mangoes in the search space. Follow the steps below to solve the problem:
- Initialize a variable ans as 0 to store the required result.
- Initialize two variables l as 0, r as W to store the boundary regions of the search space for binary search.
- Loop while l?r and perform the following steps:
- Store the middle value in a variable mid as (l+r)/2.
- Check if mid number of mangoes can be bought using the given value of W, C, x, and y.
- If true, then update ans to mid and search in the right part of mid by updating l to mid+1. Otherwise, update the value of r to mid-1.
- Print the value of ans as the result.
Below is the implementation of the above approach:
C++14
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;Â
// Function to check if mid number// of mangoes can be boughtbool check(int n, int m, int x, int y, int vl){    // Store the coins    int temp = m;Â
    // If watermelons needed are greater    // than given watermelons    if (vl > n)        return false;Â
    // Store remaining watermelons if vl    // watermelons are used to buy mangoes    int ex = n - vl;Â
    // Store the value of coins if these    // watermelon get sold    ex *= y;Â
    // Increment coins by ex    temp += ex;Â
    // Number of mangoes that can be buyed    // if only x coins needed for one mango    int cr = temp / x;Â
    // If the condition is satisfied,    // return true    if (cr >= vl)        return true;Â
    // Otherwise return false    return false;}Â
// Function to find the maximum number of mangoes// that can be bought by selling watermelonsint maximizeMangoes(int n, int m, int x, int y){    // Initialize the boundary values    int l = 0, r = n;Â
    // Store the required result    int ans = 0;Â
    // Binary Search    while (l <= r) {Â
        // Store the mid value        int mid = l + (r - l) / 2;Â
        // Check if it is possible to        // buy mid number of mangoes        if (check(n, m, x, y, mid)) {            ans = mid;            l = mid + 1;        }Â
        // Otherwise, update r to mid -1        else            r = mid - 1;    }Â
    // Return the result    return ans;}Â
// Driver Codeint main(){    // Given Input    int W = 4, C = 8, x = 4, y = 4;Â
    // Function Call    cout << maximizeMangoes(W, C, x, y);Â
    return 0;} |
Java
// Java program for the above approachclass GFG{Â
// Function to check if mid number// of mangoes can be boughtstatic boolean check(int n, int m, int x,                     int y, int vl){         // Store the coins    int temp = m;Â
    // If watermelons needed are greater    // than given watermelons    if (vl > n)        return false;Â
    // Store remaining watermelons if vl    // watermelons are used to buy mangoes    int ex = n - vl;Â
    // Store the value of coins if these    // watermelon get sold    ex *= y;Â
    // Increment coins by ex    temp += ex;Â
    // Number of mangoes that can be buyed    // if only x coins needed for one mango    int cr = temp / x;Â
    // If the condition is satisfied,    // return true    if (cr >= vl)        return true;Â
    // Otherwise return false    return false;}Â
// Function to find the maximum number // of mangoes that can be bought by // selling watermelonsstatic int maximizeMangoes(int n, int m,                            int x, int y){         // Initialize the boundary values    int l = 0, r = n;Â
    // Store the required result    int ans = 0;Â
    // Binary Search    while (l <= r)    {                 // Store the mid value        int mid = l + (r - l) / 2;Â
        // Check if it is possible to        // buy mid number of mangoes        if (check(n, m, x, y, mid))        {            ans = mid;            l = mid + 1;        }Â
        // Otherwise, update r to mid -1        else            r = mid - 1;    }Â
    // Return the result    return ans;}Â
// Driver codepublic static void main(String[] args){         // Given Input    int W = 4, C = 8, x = 4, y = 4;Â
    // Function Call    System.out.println(maximizeMangoes(W, C, x, y));}}Â
// This code is contributed by abhinavjain194 |
Python3
# Python3 program for the above approachÂ
# Function to check if mid number# of mangoes can be boughtdef check(n, m, x, y, vl):         # Store the coins    temp = mÂ
    # If watermelons needed are greater    # than given watermelons    if (vl > n):        return FalseÂ
    # Store remaining watermelons if vl    # watermelons are used to buy mangoes    ex = n - vlÂ
    # Store the value of coins if these    # watermelon get sold    ex *= yÂ
    # Increment coins by ex    temp += exÂ
    # Number of mangoes that can be buyed    # if only x coins needed for one mango    cr = temp // xÂ
    # If the condition is satisfied,    # return true    if (cr >= vl):        return TrueÂ
    # Otherwise return false    return FalseÂ
# Function to find the maximum number of mangoes# that can be bought by selling watermelonsdef maximizeMangoes(n, m, x, y):         # Initialize the boundary values    l = 0    r = nÂ
    # Store the required result    ans = 0Â
    # Binary Search    while (l <= r):Â
        # Store the mid value        mid = l + (r - l) // 2Â
        # Check if it is possible to        # buy mid number of mangoes        if (check(n, m, x, y, mid)):            ans = mid            l = mid + 1Â
        # Otherwise, update r to mid -1        else:            r = mid - 1Â
    # Return the result    return ansÂ
# Driver Codeif __name__ == '__main__':         # Given Input    W = 4    C = 8    x = 4    y = 4Â
    # Function Call    print(maximizeMangoes(W, C, x, y))     # This code is contributed by bgangwar59 |
C#
// C# program for the above approachusing System;Â
class GFG{Â
// Function to check if mid number// of mangoes can be boughtstatic bool check(int n, int m, int x,                   int y, int vl){         // Store the coins    int temp = m;Â
    // If watermelons needed are greater    // than given watermelons    if (vl > n)        return false;Â
    // Store remaining watermelons if vl    // watermelons are used to buy mangoes    int ex = n - vl;Â
    // Store the value of coins if these    // watermelon get sold    ex *= y;Â
    // Increment coins by ex    temp += ex;Â
    // Number of mangoes that can be buyed    // if only x coins needed for one mango    int cr = temp / x;Â
    // If the condition is satisfied,    // return true    if (cr >= vl)        return true;Â
    // Otherwise return false    return false;}Â
// Function to find the maximum number of mangoes// that can be bought by selling watermelonsstatic int maximizeMangoes(int n, int m, int x, int y){         // Initialize the boundary values    int l = 0, r = n;Â
    // Store the required result    int ans = 0;Â
    // Binary Search    while (l <= r)    {                 // Store the mid value        int mid = l + (r - l) / 2;Â
        // Check if it is possible to        // buy mid number of mangoes        if (check(n, m, x, y, mid))        {            ans = mid;            l = mid + 1;        }Â
        // Otherwise, update r to mid -1        else            r = mid - 1;    }Â
    // Return the result    return ans;}Â
// Driver Codepublic static void Main(){         // Given Input    int W = 4, C = 8, x = 4, y = 4;Â
    // Function Call    Console.Write(maximizeMangoes(W, C, x, y));}}                // This code is contributed by ukasp |
Javascript
<script>// Javascript program for the above approachÂ
// Function to check if mid number// of mangoes can be boughtfunction check(n, m, x, y,vl){    // Store the coins    var temp = m;Â
    // If watermelons needed are greater    // than given watermelons    if (vl > n)        return false;Â
    // Store remaining watermelons if vl    // watermelons are used to buy mangoes    var ex = n - vl;Â
    // Store the value of coins if these    // watermelon get sold    ex *= y;Â
    // Increment coins by ex    temp += ex;Â
    // Number of mangoes that can be buyed    // if only x coins needed for one mango    var cr = parseInt(temp / x);Â
    // If the condition is satisfied,    // return true    if (cr >= vl)        return true;Â
    // Otherwise return false    return false;}Â
// Function to find the maximum number of mangoes// that can be bought by selling watermelonsfunction maximizeMangoes(n, m, x, y){    // Initialize the boundary values    var l = 0, r = n;Â
    // Store the required result    var ans = 0;Â
    // Binary Search    while (l <= r) {Â
        // Store the mid value        var mid = l + parseInt((r - l) / 2);Â
        // Check if it is possible to        // buy mid number of mangoes        if (check(n, m, x, y, mid)) {            ans = mid;            l = mid + 1;        }Â
        // Otherwise, update r to mid -1        else            r = mid - 1;    }Â
    // Return the result    return ans;}var W = 4, C = 8, x = 4, y = 4;Â
// Function Calldocument.write( maximizeMangoes(W, C, x, y));Â
//This code is contributed by SoumikMondal</script> |
3
Â
Time Complexity: O(log(W))
Auxiliary Space: O(1)
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
