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: 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:
- 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:
CPP
#include <bits/stdc++.h>
using namespace std;
int minSum( int arr[][2], int n)
{
pair< int , int > temp[n];
for ( int i = 0; i < 2 * n; i++) {
temp[i].first = arr[i][1]
- arr[i][0];
temp[i].second = i;
}
sort(temp, temp + 2 * n,
greater<pair< int , int > >());
int res = 0;
for ( int i = 0; i < 2 * n; i++) {
if (i < n)
res += arr[temp[i].second][0];
else
res += arr[temp[i].second][1];
}
return res;
}
int main()
{
int arr[4][2] = { { 7, 20 },
{ 300, 50 },
{ 30, 200 },
{ 30, 20 } };
cout << minSum(arr, 2);
}
|
Java
import java.util.*;
public class GFG{
static class Pair<K,V>{
K first;
V second;
Pair(K k, V v){
first = k;
second = v;
}
}
static int minSum( int arr[][], int n)
{
Pair<Integer, Integer> temp[] = new Pair[ 2 *n];
for ( int i = 0 ; i < 2 * n; i++) {
temp[i] = new Pair(arr[i][ 1 ] - arr[i][ 0 ],i);
}
Arrays.sort(temp,(a,b)->b.first-a.first);
int res = 0 ;
for ( int i = 0 ; i < 2 * n; i++) {
if (i < n)
res += arr[temp[i].second][ 0 ];
else
res += arr[temp[i].second][ 1 ];
}
return res;
}
public static void main(String[] args) {
int arr[][] = { { 7 , 20 }, { 300 , 50 }, { 30 , 200 }, { 30 , 20 } };
System.out.println(minSum(arr, 2 ));
}
}
|
Python3
def minSum(arr, n):
temp = [ None ] * ( 2 * n)
for i in range ( 2 * n):
temp[i] = (arr[i][ 1 ] - arr[i][ 0 ], i)
temp.sort(reverse = True )
res = 0
for i in range ( 2 * n):
if (i < n):
res + = arr[temp[i][ 1 ]][ 0 ]
else :
res + = arr[temp[i][ 1 ]][ 1 ]
return res
if __name__ = = '__main__' :
arr = [[ 7 , 20 ],
[ 300 , 50 ],
[ 30 , 200 ],
[ 30 , 20 ]]
print (minSum(arr, 2 ))
|
C#
using System;
using System.Linq;
class GFG
{
public static int MinSum( int [,] arr, int n)
{
Tuple< int , int >[] temp = new Tuple< int , int >[2 * n];
for ( int i = 0; i < 2 * n; i++)
{
temp[i] = new Tuple< int , int >(arr[i, 1] - arr[i, 0], i);
}
Array.Sort(temp, (x, y) => y.Item1.CompareTo(x.Item1));
int res = 0;
for ( int i = 0; i < 2 * n; i++)
{
if (i < n) {
res += arr[temp[i].Item2, 0];
} else {
res += arr[temp[i].Item2, 1];
}
}
return res;
}
public static void Main( string [] args)
{
int [,] arr = { { 7, 20 }, { 300, 50 }, { 30, 200 }, { 30, 20 } };
Console.WriteLine(MinSum(arr, 2));
}
}
|
Javascript
function minSum(arr, n) {
let temp = new Array(2 * n).fill( null );
for (let i = 0; i < 2 * n; i++) {
temp[i] = [arr[i][1] - arr[i][0], i]
}
temp.sort((a, b) => b[0] - a[0]);
let res = 0
for (let i = 0; i < 2 * n; i++) {
if (i < n)
res += arr[temp[i][1]][0]
else
res += arr[temp[i][1]][1]
}
return res
}
let arr = [[7, 20],
[300, 50],
[30, 200],
[30, 20]]
console.log(minSum(arr, 2))
|
Time Complexity: O(N*log(N))
Auxiliary Space Complexity: O(N)
Last Updated :
16 Jan, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...