Split array into K-length subsets to minimize sum of second smallest element of each subset
Last Updated :
18 Jan, 2022
Given an array arr[] of size N and an integer K (N % K = 0), the task is to split array into subarrays of size K such that the sum of 2nd smallest elements of each subarray is the minimum possible.
Examples:
Input: arr[] = {11, 20, 5, 7, 8, 14, 2, 17, 16, 10}, K = 5
Output: 13
Explanation: Splitting array into subsets {11, 5, 14, 2, 10} and {20, 7, 8, 17, 16} generates minimum sum of second smallest elements( = 5 + 8 = 13).
Input: arr[] = {13, 19, 20, 5, 17, 11, 10, 8, 23, 14}, K = 5
Output: 19
Explanation: Splitting array into subsets {10, 19, 20, 11, 23} and {17, 5, 8, 13, 14} generates minimum sum of second smallest elements(= 11 + 8 = 19).
Approach: The problem can be solved by sorting technique. Follow the steps below to solve this problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMinimum( int arr[], int N, int K)
{
sort(arr, arr + N);
int ans = 0;
for ( int i = 1; i < 2 * (N / K); i += 2) {
ans += arr[i];
}
cout << ans;
}
int main()
{
int arr[] = { 11, 20, 5, 7, 8,
14, 2, 17, 16, 10 };
int N = sizeof (arr)
/ sizeof (arr[0]);
int K = 5;
findMinimum(arr, N, K);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
public static void findMinimum(
int arr[], int N, int K)
{
Arrays.sort(arr);
int ans = 0 ;
for ( int i = 1 ; i < 2 * (N / K); i += 2 ) {
ans += arr[i];
}
System.out.println(ans);
}
public static void main(String[] args)
{
int [] arr = { 11 , 20 , 5 , 7 , 8 ,
14 , 2 , 17 , 16 , 10 };
int N = arr.length;
int K = 5 ;
findMinimum(arr, N, K);
}
}
|
Python3
def findMinimum(arr, N, K):
arr = sorted (arr)
ans = 0
for i in range ( 1 , 2 * (N / / K), 2 ):
ans + = arr[i]
print (ans)
if __name__ = = '__main__' :
arr = [ 11 , 20 , 5 , 7 , 8 , 14 , 2 , 17 , 16 , 10 ]
N = len (arr)
K = 5
findMinimum(arr, N, K)
|
C#
using System;
class GFG{
public static void findMinimum( int [] arr, int N,
int K)
{
Array.Sort(arr);
int ans = 0;
for ( int i = 1; i < 2 * (N / K); i += 2)
{
ans += arr[i];
}
Console.WriteLine(ans);
}
public static void Main()
{
int [] arr = { 11, 20, 5, 7, 8,
14, 2, 17, 16, 10 };
int N = arr.Length;
int K = 5;
findMinimum(arr, N, K);
}
}
|
Javascript
<script>
function findMinimum(arr , N , K)
{
arr.sort((a,b)=>a-b);
var ans = 0;
for (i = 1; i < 2 * (parseInt(N / K)); i += 2)
{
ans += arr[i];
}
document.write(ans);
}
var arr = [ 11, 20, 5, 7, 8, 14, 2, 17, 16, 10 ];
var N = arr.length;
var K = 5;
findMinimum(arr, N, K);
</script>
|
Time Complexity: O(NlogN)
Space Complexity: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...