Skip to content
Related Articles

Related Articles

Minimum sum obtained by choosing N number from given N pairs
  • Last Updated : 07 Aug, 2020

Given an array arr[] of N pairs of integers (A, B) where N is even, the task is to find the minimum sum of choosing N elements such that value A and B from all the pairs are chosen exactly (N/2) times.

Examples:

Input: N = 4, arr[][] = { {7, 20}, {300, 50}, {30, 200}, {30, 20} }
Output: 107
Explanation:
Choose value-A from 1st pair = 7.
Choose value-B from 2nd pair = 50.
Choose value-A from 3rd pair = 30.
Choose value-B from 4th pair = 20.
The minimum sum is 7 + 50 + 30 + 20 = 107.

Input: N = 4, arr[][] = { {10, 20}, {400, 50}, {30, 200}, {30, 20} }
Output: 110
Explanation:
Choose value-A from 1st pair = 10.
Choose value-B from 2nd pair = 50.
Choose value-A from 3rd pair = 30.
Choose value-B from 4th pair = 20.
The minimum sum is 10 + 50 + 30 + 20 = 110.

Approach: This problem can be solved using Greedy Approach. Below are the steps:



  1. For each pair (A, B) in the given array, store the value of (B – A) with the corresponding index in temporary array(say temp[]). The value (B – A) actually defines how much cost is minimized if A is chosen over B for each element.
  2. The objective is to minimize the total cost. Hence, sort the array temp[] in decreasing order.
  3. Pick the first N/2 elements from the array temp[] by choosing A as first N/2 elements will have the maximum sum when A is chosen over B.
  4. For remaining N/2 elements choose B as the sum of values can be minimized.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to choose the elements A
// and B such the sum of all elements
// is minimum
int minSum(int arr[][2], int n)
{
  
    // Create an array of pair to
    // store Savings and index
    pair<int, int> temp[n];
  
    // Traverse the given array of pairs
    for (int i = 0; i < 2 * n; i++) {
  
        // Sum minimized when A
        // is chosen over B for
        // i-th element.
        temp[i].first = arr[i][1]
                        - arr[i][0];
  
        // Store index for the
        // future reference.
        temp[i].second = i;
    }
  
    // Sort savings array in
    // non-increasing order.
    sort(temp, temp + 2 * n,
         greater<pair<int, int> >());
  
    // Storing result
    int res = 0;
  
    for (int i = 0; i < 2 * n; i++) {
  
        // First n elements choose
        // A and rest choose B
        if (i < n)
            res += arr[temp[i].second][0];
        else
            res += arr[temp[i].second][1];
    }
  
    // Return the final Sum
    return res;
}
  
// Driver Code
int main()
{
    // Given array of pairs
    int arr[4][2] = { { 7, 20 },
                      { 300, 50 },
                      { 30, 200 },
                      { 30, 20 } };
  
    // Function Call
    cout << minSum(arr, 2);
}

chevron_right


Output:

107

Time Complexity: O(N*log(N))
Auxiliary Space Complexity: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up