Realice consultas K of Q para maximizar la suma de los elementos de la array

Dada una array arr[] de N enteros y un entero K . También se dan consultas Q que tienen dos números L y R . Para cada consulta, puede aumentar todos los elementos de la array en el rango de índice [L, R] en 1 . La tarea es elegir exactamente K consultas de Q consultas de modo que la suma de la array al final se maximice. Imprime la suma después de realizar K tales consultas. 

Ejemplos: 

Entrada: arr[] = {1, 1, 2, 2, 2, 3}, 
que[] = {{0, 4}, {1, 2}, {2, 5}, {2, 3}, { 2, 4}}, 
K = 3 
Salida: 23 
Elegimos la primera, tercera y quinta consulta. 
Después de realizar la primera consulta -> arr[] = {2, 2, 3, 3, 3, 3} 
Después de realizar la tercera consulta -> arr[] = {2, 2, 4, 4, 4, 4} 
Después de realizar la quinta consulta -> arr[] = {2, 2, 5, 5, 5, 4} 
Y la suma de la array es 2 + 2 + 5 + 5 + 5 + 4 = 23. 

Entrada: arr[] = {4, 5, 4, 21, 22}, 
que[] = {{1, 2}, {2, 2}, {2, 4}, {2, 2}}, 
K = 2 
Salida: 61 

Enfoque ingenuo: un enfoque ingenuo es usar programación dinámica y combinatoria, en el que elegimos cualquier consulta K de Q. La combinación que dé la suma máxima de la array será la respuesta. 

Complejidad de tiempo : O(N*N*K), ya que usaremos recursividad con memorización.

Espacio auxiliar: O(N*N*K), ya que usaremos espacio extra para la memorización.

Enfoque eficiente: ya que necesitamos maximizar la suma de la array al final. Solo tenemos que elegir aquellas consultas que afecten al número máximo de elementos de la array, es decir, con rangos más grandes. Cada consulta contribuye (R – L + 1) al aumento de la suma si se elige. La suma de los elementos de la array después de realizar dichas consultas será (suma inicial de la array + (Contribución de K consultas))

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 perform K queries out
// of Q to maximize the final sum
int getFinalSum(int a[], int n, pair<int, int> queries[],
                int q, int k)
{
    int answer = 0;
 
    // Get the initial sum
    // of the array
    for (int i = 0; i < n; i++)
        answer += a[i];
 
    vector<int> contribution;
 
    // Stores the contribution of every query
    for (int i = 0; i < q; i++) {
        contribution.push_back(queries[i].second
                               - queries[i].first + 1);
    }
 
    // Sort the contribution of queries
    // in descending order
    sort(contribution.begin(), contribution.end(),
         greater<int>());
 
    int i = 0;
 
    // Get the K most contributions
    while (i < k) {
        answer += contribution[i];
        i++;
    }
 
    return answer;
}
 
// Driver code
int main()
{
    int a[] = { 1, 1, 2, 2, 2, 3 };
    int n = sizeof(a) / sizeof(a[0]);
 
    pair<int, int> queries[] = { { 0, 4 },
                                 { 1, 2 },
                                 { 2, 5 },
                                 { 2, 3 },
                                 { 2, 4 } };
    int q = sizeof(queries) / sizeof(queries[0]);
 
    int k = 3;
 
    cout << getFinalSum(a, n, queries, q, k);
 
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
 
class GFG
{
 
//pair class
static class pair
{
    int first,second;
    pair(int f,int s)
    {
        first = f;
        second = s;
    }
}
 
// Function to perform K queries out
// of Q to maximize the final sum
static int getFinalSum(int a[], int n, pair queries[],
                                    int q, int k)
{
    int answer = 0;
 
    // Get the initial sum
    // of the array
    for (int i = 0; i < n; i++)
        answer += a[i];
 
    Vector<Integer> contribution = new Vector<Integer>();
 
    // Stores the contribution of every query
    for (int i = 0; i < q; i++)
    {
        contribution.add(queries[i].second
                            - queries[i].first + 1);
    }
     
    //comparator
    Comparator<Integer> Comp = new Comparator<Integer>()
    {
            public int compare(Integer e1,Integer e2)
            {
                if(e1 > e2)
                return -1;
                else
                return 1;
            }
        };
         
    // Sort the contribution of queries
    // in descending order
    Collections.sort(contribution,Comp);
 
    int i = 0;
 
    // Get the K most contributions
    while (i < k)
    {
        answer += (int) contribution.get(i);
        i++;
    }
 
    return answer;
}
 
// Driver code
public static void main(String args[])
{
    int a[] = { 1, 1, 2, 2, 2, 3 };
    int n = a.length;
 
    pair queries[] = new pair[5];
    queries[0] = new pair( 0, 4 );
    queries[1] = new pair( 1, 2 );
    queries[2] = new pair( 2, 5 );
    queries[3] = new pair( 2, 3 );
    queries[4] = new pair( 2, 4 );
    int q = queries.length;
 
    int k = 3;
    System.out.println( getFinalSum(a, n, queries, q, k));
}
}
 
// This code is contributed by Arnab Kundu

Python3

# Python 3 implementation of the approach
 
# Function to perform K queries out
# of Q to maximize the final sum
def getFinalSum(a, n, queries, q, k):
    answer = 0
 
    # Get the initial sum
    # of the array
    for i in range(n):
        answer += a[i]
 
    contribution = []
 
    # Stores the contribution of every query
    for i in range(q):
        contribution.append(queries[i][1]-
                            queries[i][0] + 1)
 
    # Sort the contribution of queries
    # in descending order
    contribution.sort(reverse = True)
 
    i = 0
 
    # Get the K most contributions
    while (i < k):
        answer += contribution[i]
        i += 1
 
    return answer
 
# Driver code
if __name__ == '__main__':
    a = [1, 1, 2, 2, 2, 3]
    n = len(a)
 
    queries = [[0, 4], [1, 2],
               [2, 5], [2, 3],
               [2, 4]]
    q = len(queries);
 
    k = 3
 
    print(getFinalSum(a, n, queries, q, k))
 
# This code is contributed by
# Surendra_Gangwar

Javascript

<script>
    // JavaScript implementation of the approach
 
    // Function to perform K queries out
    // of Q to maximize the final sum
    const getFinalSum = (a, n, queries, q, k) => {
        let answer = 0;
 
        // Get the initial sum
        // of the array
        for (let i = 0; i < n; i++)
            answer += a[i];
 
        let contribution = [];
 
        // Stores the contribution of every query
        for (let i = 0; i < q; i++) {
            contribution.push(queries[i][1] - queries[i][0] + 1);
        }
 
        // Sort the contribution of queries
        // in descending order
        contribution.sort((a, b) => b - a);
 
        let i = 0;
 
        // Get the K most contributions
        while (i < k) {
            answer += contribution[i];
            i++;
        }
 
        return answer;
    }
 
    // Driver code
 
    const a = [1, 1, 2, 2, 2, 3];
    const n = a.length;
 
    const queries = [
        [0, 4],
        [1, 2],
        [2, 5],
        [2, 3],
        [2, 4]
    ];
    const q = queries.length;
 
    let k = 3;
 
    document.write(getFinalSum(a, n, queries, q, k));
     
    // This code is contributed by rakeshsahni
 
</script>
Producción: 

23

 

Complejidad de tiempo: O(max(n,k,q*log(q))), ya que estamos usando un ciclo para atravesar n y k veces y estamos usando una función de ordenación para ordenar una array de tamaño q.

Espacio auxiliar: O(q), ya que estamos usando espacio adicional para la contribución de la array.

Publicación traducida automáticamente

Artículo escrito por Striver 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 *