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 bought 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 watermelons 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 Code int 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 approach class GFG{ Â
// Function to check if mid number // of mangoes can be bought static 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 watermelons static 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 code public 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 bought def 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 watermelons def 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 Code if __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 approach using System; Â
class GFG{ Â
// Function to check if mid number // of mangoes can be bought static 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 watermelons static 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 Code public 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 bought function 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 watermelons function 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 Call document.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!