# Pick maximum sum M elements such that contiguous repetitions do not exceed K

• Difficulty Level : Medium
• Last Updated : 25 Apr, 2022

Given an array arr[] of distinct elements and two integers M and K, the task is to generate an array from the given array elements (elements can repeat in the generated array) such that the size of the generated array is M and the length of any sub-array with all same elements must not exceed K. Print the maximum sum of the elements among all the possible arrays that can be generated.
Examples:

Input: arr[] = {1, 3, 6, 7, 4, 5}, M = 9, K = 2
Output: 60
The maxim sum arrangement is 7 7 6 7 7 6 7 7 6. Note that there is no subarray of size more than 2 with all same elements.
Input: arr[] = {8, 13, 9, 17, 4, 12}, M = 5, K = 1
Output: 77
The maxim sum arrangement is 17, 13, 17, 13, 17

Approach: If we want the maximum sum we have to take maximum value from the array but we can repeat this maximum value at most K times so we have to separate it by second maximum value only once and after that we again take first maximum value up to K times and this cycle goes on until we take total M values.
Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `// Function to return the maximum required sum``long` `int` `maxSum(``int` `arr[], ``int` `n, ``int` `m, ``int` `k)``{` `    ``int` `max1 = -1, max2 = -1;` `    ``// All the elements in the array are distinct``    ``// Finding the maximum and the second maximum``    ``// element from the array``    ``for` `(``int` `i = 0; i < n; i++) {``        ``if` `(arr[i] > max1) {``            ``max2 = max1;``            ``max1 = arr[i];``        ``}``        ``else` `if` `(arr[i] > max2)``            ``max2 = arr[i];``    ``}` `    ``// Total times the second maximum element``    ``// will appear in the generated array``    ``int` `counter = m / (k + 1);` `    ``long` `int` `sum = counter * max2 + (m - counter) * max1;` `    ``// Return the required sum``    ``return` `sum;``}` `// Driver code``int` `main()``{``    ``int` `arr[] = { 1, 3, 6, 7, 4, 5 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``    ``int` `m = 9, k = 2;``    ``cout << maxSum(arr, n, m, k);` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``import` `java.util.*;` `class` `GFG``{` `// Function to return the maximum required sum``static` `int` `maxSum(``int` `arr[], ``int` `n, ``int` `m, ``int` `k)``{` `    ``int` `max1 = -``1``, max2 = -``1``;` `    ``// All the elements in the array are distinct``    ``// Finding the maximum and the second maximum``    ``// element from the array``    ``for` `(``int` `i = ``0``; i < n; i++)``    ``{``        ``if` `(arr[i] > max1)``        ``{``            ``max2 = max1;``            ``max1 = arr[i];``        ``}``        ``else` `if` `(arr[i] > max2)``            ``max2 = arr[i];``    ``}` `    ``// Total times the second maximum element``    ``// will appear in the generated array``    ``int` `counter = m / (k + ``1``);` `    ``int` `sum = counter * max2 + (m - counter) * max1;` `    ``// Return the required sum``    ``return` `sum;``}` `// Driver code``public` `static` `void` `main(String args[])``{``    ``int` `arr[] = { ``1``, ``3``, ``6``, ``7``, ``4``, ``5` `};``    ``int` `n = arr.length;``    ``int` `m = ``9``, k = ``2``;``    ``System.out.println(maxSum(arr, n, m, k));``}``}` `// This code is contributed by``// Surendra Gangwar`

## Python3

 `# Python3 implementation of the approach``def` `maxSum(arr, n, m, k):` `    ``max1 ``=` `-``1``    ``max2 ``=` `-``1``    ` `    ``# All the elements in the array are distinct``    ``# Finding the maximum and the second maximum``    ``# element from the array``    ``for` `i ``in` `range``(``0``, n):``        ``if``(arr[i] > max1):``            ``max2 ``=` `max1``            ``max1 ``=` `arr[i]``        ``elif``(arr[i] > max2):``            ``max2 ``=` `arr[i]``    ` `    ``# Total times the second maximum element``    ``# will appear in the generated array``    ``counter ``=` `int``(m ``/` `(k ``+` `1``))``    ` `    ``sum` `=` `counter ``*` `max2 ``+` `(m ``-` `counter) ``*` `max1``    ` `    ``# Return the required sum``    ``return` `int``(``sum``)` `# Driver code``arr ``=` `[``1``, ``3``, ``6``, ``7``, ``4``, ``5``]``n ``=` `len``(arr)``m ``=` `9``k ``=` `2` `print``(maxSum(arr, n, m, k))`

## C#

 `// C# implementation of the approach``using` `System;` `class` `GFG``{` `// Function to return the maximum required sum``static` `int` `maxSum(``int` `[]arr, ``int` `n, ``int` `m, ``int` `k)``{` `    ``int` `max1 = -1, max2 = -1;` `    ``// All the elements in the array are distinct``    ``// Finding the maximum and the second maximum``    ``// element from the array``    ``for` `(``int` `i = 0; i < n; i++)``    ``{``        ``if` `(arr[i] > max1)``        ``{``            ``max2 = max1;``            ``max1 = arr[i];``        ``}``        ``else` `if` `(arr[i] > max2)``            ``max2 = arr[i];``    ``}` `    ``// Total times the second maximum element``    ``// will appear in the generated array``    ``int` `counter = m / (k + 1);` `    ``int` `sum = counter * max2 + (m - counter) * max1;` `    ``// Return the required sum``    ``return` `sum;``}` `// Driver code``public` `static` `void` `Main(String []args)``{``    ``int` `[]arr = { 1, 3, 6, 7, 4, 5 };``    ``int` `n = arr.Length;``    ``int` `m = 9, k = 2;``    ``Console.WriteLine(maxSum(arr, n, m, k));``}``}` `/* This code contributed by PrinciRaj1992 */`

## Javascript

 ``

Output:

`60`

Time Complexity: O(n), where n is the size of the given array.
Auxiliary Space: O(1), no extra space used.

My Personal Notes arrow_drop_up