Count of minimum reductions required to get the required sum K

Given N pairs of integers and an integer K, the task is to find the minimum number of reductions required such that the sum of the first elements of each pair is ≤ K.Each reduction involves reducing the first value of a pair to its second value. If it is not possible to make the sum ≤ K, print -1.

Examples:
Input: N = 5, K = 32
10 6
6 4
8 5
9 8
5 2
Output: 2
Explanation:
Total Sum = 10 + 6 + 8 + 9 + 5 = 38 > K
Reducing 10 – > 6 and 8 – > 5 reduces the sum to 31( 6 + 6 + 5 + 9 + 5) which is less than K.

Input: N = 4, K = 25
10 5
20 9
12 10
4 2
Output: -1

Approach:
Follow the steps below to solve the problem:

  1. Calculate the sum of the first element of every pair. If the sum is already ≤ K, print 0.
  2. Sort the given pairs based on their difference.
  3. Count the number of differences of pairs that need to be added in non-increasing order to get the sum to be less than K.
  4. If the sum exceeds K after traversal of all pairs, print -1. Otherwise, print the count.

Below is the implementation of the above approach:



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to find the count of
// minimum reductions required to
// get the required sum K
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the count
// of minimum reductions
int countReductions(
    vector<pair<int, int> >& v,
    int K)
{
  
    int sum = 0;
    for (auto i : v) {
        sum += i.first;
    }
  
    // If the sum is already
    // less than K
    if (sum <= K) {
        return 0;
    }
  
    // Sort in non-increasing
    // order of difference
    sort(v.begin(), v.end(),
         [&](
             pair<int, int> a,
             pair<int, int> b) {
             return (a.first - a.second)
                    > (b.first - b.second);
         });
  
    int i = 0;
    while (sum > K && i < v.size()) {
        sum -= (v[i].first
                - v[i].second);
        i++;
    }
  
    if (sum <= K)
        return i;
  
    return -1;
}
  
// Driver Code
int main()
{
    int N = 4, K = 25;
  
    vector<pair<int, int> > v(N);
    v[0] = { 10, 5 };
    v[1] = { 20, 9 };
    v[2] = { 12, 10 };
    v[3] = { 4, 2 };
  
    // Function Call
    cout << countReductions(v, K)
         << endl;
    return 0;
}

chevron_right


Output:

-1

Time Complexity:O(NlogN)
Auxillary Space:O(1)

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.