Elija la suma máxima M elementos de modo que las repeticiones contiguas no excedan K

Dada una array arr[] de elementos distintos y dos enteros M y K , la tarea es generar una array a partir de los elementos de array dados (los elementos pueden repetirse en la array generada) de modo que el tamaño de la array generada sea M y la longitud de cualquier subarreglo con todos los mismos elementos no debe exceder K . Imprime la suma máxima de los elementos entre todos los arreglos posibles que se pueden generar.
Ejemplos: 
 

Entrada: arr[] = {1, 3, 6, 7, 4, 5}, M = 9, K = 2 
Salida: 60 
El arreglo de suma máxima es 7 7 6 7 7 6 7 7 6. Tenga en cuenta que no hay subarreglo de tamaño superior a 2 con todos los mismos elementos.
Entrada: arr[] = {8, 13, 9, 17, 4, 12}, M = 5, K = 1 
Salida: 77 
El arreglo de suma máxima es 17, 13, 17, 13, 17 
 

Enfoque: si queremos la suma máxima, debemos tomar el valor máximo de la array, pero podemos repetir este valor máximo como máximo K veces, por lo que debemos separarlo por el segundo valor máximo solo una vez y luego tomamos nuevamente el primer valor máximo. a K veces y este ciclo continúa hasta que tomamos M valores totales.
A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
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 */

Javascript

<script>
 
// JavaScript implementation of the approach
 
// Function to return the maximum required sum
function maxSum(arr, n, m, k)
{
 
    var max1 = -1, max2 = -1;
 
    // All the elements in the array are distinct
    // Finding the maximum and the second maximum
    // element from the array
    for (var 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
    var counter = m / (k + 1);
 
    var sum = counter * max2 + (m - counter) * max1;
 
    // Return the required sum
    return sum;
}
 
// Driver code
var arr = [1, 3, 6, 7, 4, 5];
var n = arr.length;
var m = 9, k = 2;
document.write( maxSum(arr, n, m, k));
 
 
</script>
Producción: 

60

 

Complejidad de tiempo: O(n), donde n es el tamaño de la array dada.
Espacio auxiliar: O(1), no se utiliza espacio adicional.

Publicación traducida automáticamente

Artículo escrito por Chandan_Agrawal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *