给定一个由不同元素和两个整数M和K组成的数组arr [] ,任务是从给定的数组元素中生成一个数组(元素可以在生成的数组中重复),使得生成的数组的大小为M ,长度为具有相同元素的任何子数组的总和不得超过K。打印所有可能生成的数组中元素的最大和。
例子:
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
方法:如果我们想要最大和,我们必须从数组中取最大值,但是我们最多可以重复该最大值K次,因此我们只能将其与第二个最大值分开一次,然后再取第一个最大值。到K次,这个循环一直持续到我们取M个总值为止。
下面是上述方法的实现:
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[0]);
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 */
输出:
60
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。