Split array into K subsets to maximize their sum of maximums and minimums
Last Updated :
24 Nov, 2021
Given an integer K and an array A[ ] whose length is multiple of K, the task is to split the elements of the given array into K subsets, each having an equal number of elements, such that the sum of the maximum and minimum elements of each subset is the maximum summation possible.
Examples:
Input: K = 2, A[ ] = {1, 13, 7, 17, 6, 5}
Output: 37
Explanation:
1st group: {1, 5, 17} maximum = 17, minimum = 1
2nd group: {6, 7, 13} maximum = 13, minimum = 6
Hence, maximum possible sum = 17 + 1 + 13 + 6 = 37
Input: K = 2, A[ ] = {10, 10, 10, 10, 11, 11}
Output: 42
Explanation:
1st group: {11, 10, 10} maximum = 11, minimum = 10
2nd group: {11, 10, 10} maximum = 11, minimum = 10
Hence, maximum sum possible = 11 + 10 + 11 + 10 = 42
Naive Approach:
The simplest approach to solve this problem is to generate all possible groups of K subsets of size N/K and for each group, find maximum and minimum in every subset and calculate their sum. Once the sum of all groups is calculated, print the maximum sum obtained.
Time Complexity: O(2N)
Auxiliary Space: O(N)
Efficient Approach:
The idea is to optimize the above approach using the Greedy Technique. Since the maximum sum of the maximum and minimum element from each subset is needed, try to maximize the maximum element and minimum element. For the maximum element of each subset, take first K largest elements from the given array and insert each one to different subsets. For the minimum element of each subset, from the sorted array, starting from index 0, pick every next element at (N / K) - 1 interval since the size of each subset is N / K and each one already contains a maximum element.
Follow the steps below:
- Calculate the number of elements in each group i.e. (N/K).
- Sort all the elements of A[ ] in non-descending order.
- For the sum of maximum elements, add all K largest elements from the sorted array.
- For the sum of minimum elements, starting from index 0, select K elements each with (N / K) - 1 interval and add them.
- Finally, calculate the sum of maximum and the sum of minimum elements. Print the sum of their respective sums as the final answer.
Below is the implementation of the above approach:
C++
// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
// Function that prints
// the maximum sum possible
void maximumSum(int arr[],
int n, int k)
{
// Find elements in each group
int elt = n / k;
int sum = 0;
// Sort all elements in
// non-descending order
sort(arr, arr + n);
int count = 0;
int i = n - 1;
// Add K largest elements
while (count < k) {
sum += arr[i];
i--;
count++;
}
count = 0;
i = 0;
// For sum of minimum
// elements from each subset
while (count < k) {
sum += arr[i];
i += elt - 1;
count++;
}
// Printing the maximum sum
cout << sum << "\n";
}
// Driver Code
int main()
{
int Arr[] = { 1, 13, 7, 17, 6, 5 };
int K = 2;
int size = sizeof(Arr) / sizeof(Arr[0]);
maximumSum(Arr, size, K);
return 0;
}
Java
// Java program to implement
// the above approach
import java.util.Arrays;
class GFG{
// Function that prints
// the maximum sum possible
static void maximumSum(int arr[],
int n, int k)
{
// Find elements in each group
int elt = n / k;
int sum = 0;
// Sort all elements in
// non-descending order
Arrays.sort(arr);
int count = 0;
int i = n - 1;
// Add K largest elements
while (count < k)
{
sum += arr[i];
i--;
count++;
}
count = 0;
i = 0;
// For sum of minimum
// elements from each subset
while (count < k)
{
sum += arr[i];
i += elt - 1;
count++;
}
// Printing the maximum sum
System.out.println(sum);
}
// Driver code
public static void main (String[] args)
{
int Arr[] = { 1, 13, 7, 17, 6, 5 };
int K = 2;
int size = Arr.length;
maximumSum(Arr, size, K);
}
}
// This code is contributed by Shubham Prakash
Python3
# Python3 program to implement
# the above approach
# Function that prints
# the maximum sum possible
def maximumSum(arr, n, k):
# Find elements in each group
elt = n // k;
sum = 0;
# Sort all elements in
# non-descending order
arr.sort();
count = 0;
i = n - 1;
# Add K largest elements
while (count < k):
sum += arr[i];
i -= 1;
count += 1;
count = 0;
i = 0;
# For sum of minimum
# elements from each subset
while (count < k):
sum += arr[i];
i += elt - 1;
count += 1;
# Printing the maximum sum
print(sum);
# Driver code
if __name__ == '__main__':
Arr = [1, 13, 7, 17, 6, 5];
K = 2;
size = len(Arr);
maximumSum(Arr, size, K);
# This code is contributed by sapnasingh4991
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function that prints
// the maximum sum possible
static void maximumSum(int []arr,
int n, int k)
{
// Find elements in each group
int elt = n / k;
int sum = 0;
// Sort all elements in
// non-descending order
Array.Sort(arr);
int count = 0;
int i = n - 1;
// Add K largest elements
while (count < k)
{
sum += arr[i];
i--;
count++;
}
count = 0;
i = 0;
// For sum of minimum
// elements from each subset
while (count < k)
{
sum += arr[i];
i += elt - 1;
count++;
}
// Printing the maximum sum
Console.WriteLine(sum);
}
// Driver code
public static void Main(String[] args)
{
int []Arr = { 1, 13, 7, 17, 6, 5 };
int K = 2;
int size = Arr.Length;
maximumSum(Arr, size, K);
}
}
// This code is contributed by amal kumar choubey
JavaScript
<script>
// Javascript program implementation
// of the approach
// Function that prints
// the maximum sum possible
function maximumSum(arr, n, k)
{
// Find elements in each group
let elt = (n / k);
let sum = 0;
// Sort all elements in
// non-descending order
arr.sort((a, b) => a - b);
let count = 0;
let i = n - 1;
// Add K largest elements
while (count < k)
{
sum += arr[i];
i--;
count++;
}
count = 0;
i = 0;
// For sum of minimum
// elements from each subset
while (count < k)
{
sum += arr[i];
i += elt - 1;
count++;
}
// Printing the maximum sum
document.write(sum);
}
// Driver Code
let Arr = [ 1, 13, 7, 17, 6, 5 ];
let K = 2;
let size = Arr.length;
maximumSum(Arr, size, K);
</script>
Time complexity: O(N*logN)
Auxiliary Space: O(1)
Similar Reads
Split array into K non-empty subsets such that sum of their maximums and minimums is maximized Given two arrays arr[] and S[] consisting of N and K integers, the task is to find the maximum sum of minimum and maximum of each subset after splitting the array into K subsets such that the size of each subset is equal to one of the elements in the array S[]. Examples: Input: arr[] = {1, 13, 7, 17
7 min read
Split given arrays into subarrays to maximize the sum of maximum and minimum in each subarrays Given an array arr[] consisting of N integers, the task is to maximize the sum of the difference of the maximum and minimum in each subarrays by splitting the given array into non-overlapping subarrays. Examples: Input: arr[] = {8, 1, 7, 9, 2}Output: 14Explanation:Split the given array arr[] as {8,
6 min read
Divide an array into k segments to maximize maximum of segment minimums Given an array of n integers, divide it into k segments and find the maximum of the minimums of k segments. Output the maximum integer that can be obtained among all ways to segment in k subarrays. Examples: Input : arr[] = {1, 2, 3, 6, 5} k = 2 Output: 5 Explanation: There are many ways to create t
5 min read
Maximize the maximum among minimum of K consecutive sub-arrays Given an integer K and an array arr[], the task is to split the array arr[] into K consecutive subarrays to find the maximum possible value of the maximum among the minimum value of K consecutive sub-arrays. Examples: Input: arr[] = {1, 2, 3, 4, 5}, K = 2 Output: 5 Split the array as [1, 2, 3, 4] an
9 min read
Split array into K subarrays such that sum of maximum of all subarrays is maximized Given an array arr[] of size N and a number K, the task is to partition the given array into K contiguous subarrays such that the sum of the maximum of each subarray is the maximum possible. If it is possible to split the array in such a manner, then print the maximum possible sum. Otherwise, print
10 min read