Minimice el costo de reducir la array reemplazando dos elementos con suma como máximo K veces para cualquier índice

Dada una array arr[] de tamaño N y un entero K . La tarea es encontrar el costo mínimo requerido para recolectar la suma de la array. La suma de la array se recopila seleccionando cualquier elemento y agregándolo a un elemento de cualquier índice de la array. La adición de elementos con el mismo índice se permite como máximo K veces.

Ejemplo:

Entrada: arr[] = {3, 6, 4, 1, 1}, N = 5, K = 2
Salida: 11
Explicación: La suma de la array se puede recopilar de la siguiente manera:

  • Elija el elemento en el índice 4 y agréguelo al elemento en el índice 2, es decir (1 ⇢ 4) = 1+4 = 5, cost = 1 y arr[] = {3, 6, 5, 1, 0}.
  • Elija el elemento en el índice 3 y agréguelo al elemento en el índice 2, es decir (1 ⇢ 5) = 1+5 = 6, cost = 1+1 = 2 y arr[] = {3, 6, 6, 0, 0}.
  • Elija el elemento en el índice 0 y agréguelo al elemento en el índice 1, es decir (3 ⇢ 6) = 3+6 = 9, costo = 2+3 = 5 y arr[] = {0, 9, 6, 0, 0}.
  • Elija el elemento en el índice 2 y agréguelo al elemento en el índice 1, es decir (6 ⇢ 9) = 6+9 = 15, cost = 5+6 = 11 y arr[] = {0, 15, 0, 0, 0}.

Entrada: arr[] = {5, 3, 2, 1, 4, 6}, N = 6, K = 3
Salida: 18
Explicación: La suma se puede recopilar de la siguiente manera

  • Elija el elemento en el índice 3 y agréguelo al elemento en el índice 4, es decir (1 ⇢ 4) = 1+4 = 5, cost = 1 y arr[] = {5, 3, 2, 0, 5, 6}.
  • Elija el elemento en el índice 2 y agréguelo al elemento en el índice 0, es decir, (2 ⇢ 5) = 2+5 = 7, cost = 1+2 = 3 y arr[] = {7, 3, 0, 0, 5, 6 }.
  • Elija el elemento en el índice 1 y agréguelo al elemento en el índice 5, es decir (3 ⇢ 6) = 3+6 = 9, cost = 3+3 = 6 y arr[] = {7, 0, 0, 0, 5, 9 }.
  • Elija el elemento en el índice 4 y agréguelo al elemento en el índice 5, es decir (5 ⇢ 9) = 5+9 = 14, cost = 6+5 = 11 y arr[] = {7, 0, 0, 0, 0, 14 }.
  • Elija el elemento en el índice 0 y agréguelo al elemento en el índice 5, es decir (7 ⇢ 14) = 7+14 = 21, cost = 11+7 = 18 y arr[] = {0, 0, 0, 0, 0, 21 }.
 

Enfoque: el problema dado se puede resolver utilizando un enfoque codicioso . La idea es ordenar la array . siguiente interpretación del problema: los elementos dados son los vértices del grafo. Operación ⇢ añadir un elemento a otro ⇢ cambia a operación de suspensión de subárbol de un vértice a otro. 

La tarea es obtener una configuración de árbol tal, que cada vértice no tenga más de K subárboles suspendidos, y la suma de los productos de los números, escritos en los vértices, y la profundidad de los vértices (donde la profundidad de la raíz es 0) sea mínima. Para minimizar la suma:

  • los vértices con un número mayor no deben tener más profundidad que los vértices con un número menor (de lo contrario, es posible cambiarlos y obtener una suma menor).
  • cada uno de los vértices interiores, además de, quizás, uno, tiene exactamente k sucesores. (En la implementación real, no hay necesidad de construir un árbol, solo necesitamos saber que se trata de un árbol).

Ahora calcule la suma para esta configuración. Para hacerlo, siga los siguientes pasos:   

  • Agregue a la respuesta la suma de los elementos del 1 al k-ésimo (en una array indexada en 0, ordenada en orden no creciente), multiplicada por 1 ; luego la suma de los tamaños de los siguientes k montones, multiplicada por 2; y así sucesivamente hasta el final de la array.
  • Para obtener la respuesta sobre la suma del segmento, use la suma del prefijo después de ordenar la array.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the difference
// of the elements in a range
int sum(int s[], int l, int r, int N)
{
 
    r = min(r, (N - 1));
 
    return s[r] - s[l - 1];
}
 
// Function to find the minimum cost required
// to collect the sum of the array
int minCost(int arr[], int K, int N)
{
 
    int s[N];
 
    // Sort the array in descending order
    sort(arr, arr + N, greater<int>());
 
    s[0] = arr[0];
 
    // Traverse and store the sums
    // in prefix array s[]
    for (int i = 1; i < N; i++)
        s[i] = s[i - 1] + arr[i];
 
    int res_1 = 0;
 
    // Iterate the array and add the
    // value of the element
    // multiplied by its index
    for (int i = 1; i < N; i++)
        res_1 += arr[i] * i;
 
    // If K = 1 return res_1
    if (K == 1)
        return res_1;
 
    // Variable to store the answer
    int res = 0, sz = 1;
 
    // Traverse and find the
    // answer accordingly
    for (int j = 1, t = 1; j < N; j += sz, t++) {
 
        sz *= K;
        res += sum(s, j, j + sz - 1, N) * t;
    }
 
    // Return res
    return res;
}
 
// Driver Code
int main()
{
 
    // Initialize the array
    int arr[] = { 3, 6, 4, 1, 1 };
 
    int K = 2;
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Call the function and
    // print the answer
    cout << minCost(arr, K, N);
 
    return 0;
}

Java

// Java code for the above approach
import java.util.Arrays;
import java.util.Collections;
class GFG {
 
    // Function to return the difference
    // of the elements in a range
    static int sum(int s[], int l, int r, int N)
    {
 
        r = Math.min(r, (N - 1));
 
        return s[r] - s[l - 1];
    }
 
    // Function to find the minimum cost required
    // to collect the sum of the array
    static int minCost(int arr[], int K, int N)
    {
 
        int[] s = new int[N];
 
        // Sort the array in descending order
        // Sorting the array in ascending order
        Arrays.sort(arr);
 
        // Reversing the array
        reverse(arr);
 
        s[0] = arr[0];
 
        // Traverse and store the sums
        // in prefix array s[]
        for (int i = 1; i < N; i++)
            s[i] = s[i - 1] + arr[i];
 
        int res_1 = 0;
 
        // Iterate the array and add the
        // value of the element
        // multiplied by its index
        for (int i = 1; i < N; i++)
            res_1 += arr[i] * i;
 
        // If K = 1 return res_1
        if (K == 1)
            return res_1;
 
        // Variable to store the answer
        int res = 0, sz = 1;
 
        // Traverse and find the
        // answer accordingly
        for (int j = 1, t = 1; j < N; j += sz, t++) {
 
            sz *= K;
            res += sum(s, j, j + sz - 1, N) * t;
        }
 
        // Return res
        return res;
    }
    public static void reverse(int[] array)
    {
 
        // Length of the array
        int n = array.length;
 
        // Swaping the first half elements with last half
        // elements
        for (int i = 0; i < n / 2; i++) {
 
            // Storing the first half elements temporarily
            int temp = array[i];
 
            // Assigning the first half to the last half
            array[i] = array[n - i - 1];
 
            // Assigning the last half to the first half
            array[n - i - 1] = temp;
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
       
        // Initialize the array
        int arr[] = { 3, 6, 4, 1, 1 };
 
        int K = 2;
        int N = arr.length;
 
        // Call the function and
        // print the answer
 
        System.out.println(minCost(arr, K, N));
    }
}
 
// This code is contributed by Potta Lokesh

Python3

# Python implementation for the above approach
 
# Function to return the difference
# of the elements in a range
def sum (s, l, r, N):
    r = min(r, (N - 1))
    return s[r] - s[l - 1]
 
# Function to find the minimum cost required
# to collect the sum of the array
def minCost (arr, K, N):
 
    s = [0] * N
 
    # Sort the array in descending order
    arr = sorted(arr, reverse=True)
 
    s[0] = arr[0]
 
    # Traverse and store the sums
    # in prefix array s[]
    for i in range(1, N):
        s[i] = s[i - 1] + arr[i]
 
    res_1 = 0
 
    # Iterate the array and add the
    # value of the element
    # multiplied by its index
    for i in range(1, N):
        res_1 += arr[i] * i
 
    # If K = 1 return res_1
    if (K == 1):
        return res_1
 
    # Variable to store the answer
    res = 0
    sz = 1
 
    # Traverse and find the
    # answer accordingly
    j=1
    t=1
 
    while(j < N ):
        sz *= K
        res += sum(s, j, j + sz - 1, N) * t
        j += sz
        t += 1
     
 
    # Return res
    return res
 
# Driver Code
 
# Initialize the array
arr = [3, 6, 4, 1, 1]
 
K = 2
N = len(arr)
 
# Call the function and
# print the answer
print(minCost(arr, K, N))
 
# This code is contributed by Saurabh Jaiswal

C#

// C# code for the above approach
using System;
 
public class GFG {
 
    // Function to return the difference
    // of the elements in a range
    static int sum(int []s, int l, int r, int N)
    {
 
        r = Math.Min(r, (N - 1));
 
        return s[r] - s[l - 1];
    }
 
    // Function to find the minimum cost required
    // to collect the sum of the array
    static int minCost(int []arr, int K, int N)
    {
 
        int[] s = new int[N];
 
        // Sort the array in descending order
        // Sorting the array in ascending order
        Array.Sort(arr);
 
        // Reversing the array
        reverse(arr);
 
        s[0] = arr[0];
 
        // Traverse and store the sums
        // in prefix array s[]
        for (int i = 1; i < N; i++)
            s[i] = s[i - 1] + arr[i];
 
        int res_1 = 0;
 
        // Iterate the array and add the
        // value of the element
        // multiplied by its index
        for (int i = 1; i < N; i++)
            res_1 += arr[i] * i;
 
        // If K = 1 return res_1
        if (K == 1)
            return res_1;
 
        // Variable to store the answer
        int res = 0, sz = 1;
 
        // Traverse and find the
        // answer accordingly
        for (int j = 1, t = 1; j < N; j += sz, t++) {
 
            sz *= K;
            res += sum(s, j, j + sz - 1, N) * t;
        }
 
        // Return res
        return res;
    }
    public static void reverse(int[] array)
    {
 
        // Length of the array
        int n = array.Length;
 
        // Swaping the first half elements with last half
        // elements
        for (int i = 0; i < n / 2; i++) {
 
            // Storing the first half elements temporarily
            int temp = array[i];
 
            // Assigning the first half to the last half
            array[i] = array[n - i - 1];
 
            // Assigning the last half to the first half
            array[n - i - 1] = temp;
        }
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
       
        // Initialize the array
        int []arr = { 3, 6, 4, 1, 1 };
 
        int K = 2;
        int N = arr.Length;
 
        // Call the function and
        // print the answer
 
        Console.WriteLine(minCost(arr, K, N));
    }
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
    // JavaScript implementation for the above approach
 
    // Function to return the difference
    // of the elements in a range
    const sum = (s, l, r, N) => {
 
        r = Math.min(r, (N - 1));
 
        return s[r] - s[l - 1];
    }
 
    // Function to find the minimum cost required
    // to collect the sum of the array
    const minCost = (arr, K, N) => {
 
        let s = new Array(N).fill(0);
 
        // Sort the array in descending order
        arr.sort((a, b) => b - a);
 
        s[0] = arr[0];
 
        // Traverse and store the sums
        // in prefix array s[]
        for (let i = 1; i < N; i++)
            s[i] = s[i - 1] + arr[i];
 
        let res_1 = 0;
 
        // Iterate the array and add the
        // value of the element
        // multiplied by its index
        for (let i = 1; i < N; i++)
            res_1 += arr[i] * i;
 
        // If K = 1 return res_1
        if (K == 1)
            return res_1;
 
        // Variable to store the answer
        let res = 0, sz = 1;
 
        // Traverse and find the
        // answer accordingly
        for (let j = 1, t = 1; j < N; j += sz, t++) {
 
            sz *= K;
            res += sum(s, j, j + sz - 1, N) * t;
        }
 
        // Return res
        return res;
    }
 
    // Driver Code
 
    // Initialize the array
    let arr = [3, 6, 4, 1, 1];
 
    let K = 2;
    let N = arr.length
 
    // Call the function and
    // print the answer
    document.write(minCost(arr, K, N));
 
    // This code is contributed by rakeshsahni
 
</script>
Producción

11

Complejidad de tiempo: O(N* log N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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