# Minimum sum obtained by choosing N number from given N pairs

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:107Explanation:

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:110Explanation:

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:

- 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. - The objective is to minimize the total cost. Hence, sort the array
**temp[]**in decreasing order. - 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**. - For remaining
**N/2**elements choose**B**as the sum of values can be minimized.

Below is the implementation of the above approach:

`// 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);` `}` |

**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. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.