Costo mínimo requerido para convertir todos los Subarreglos de tamaño K en un solo elemento

Requisito previo: Mediana de ventana deslizante
Dado un arreglo arr[] que consta de N enteros y un entero K , la tarea es encontrar el costo mínimo requerido para hacer que cada elemento de cada subarreglo de longitud K sea igual. El costo de reemplazar cualquier elemento de la array por otro elemento es la diferencia absoluta entre los dos.
Ejemplos: 
 

Entrada: A[] = {1, 2, 3, 4, 6}, K = 3 
Salida:
Explicación: 
Subarreglo 1: Costo de convertir el subarreglo {1, 2, 3} a {2, 2, 2} = | 1-2| + |2-2| + |3-2| = 2 
Subarreglo 2: Costo de convertir el subarreglo {2, 3, 4} a {3, 3, 3} = |2-3| + |3-3| + |4-3| = 2 
Subarreglo 3: Costo de convertir el subarreglo {3, 4, 6} a {4, 4, 4} = |3-4| + |4-4| + |6-4| = 3 
Costo mínimo = 2 + 2 + 3 = 7/
Entrada: A[] = {2, 3, 4, 4, 1, 7, 6}, K = 4 
Salida: 21 
 

Enfoque: 
para encontrar el costo mínimo para convertir cada elemento del subarreglo en un solo elemento, cambie cada elemento del subarreglo a la mediana de ese subarreglo . Siga los pasos a continuación para resolver el problema: 
 

  • Para encontrar la mediana para cada subarreglo en ejecución de manera eficiente, use un conjunto múltiple para obtener el orden ordenado de los elementos en cada subarreglo. La mediana será el elemento central de este conjunto múltiple .
  • Para el siguiente subarreglo, elimine el elemento más a la izquierda del subarreglo anterior del conjunto múltiple, agregue el elemento actual al conjunto múltiple.
  • Mantenga un puntero en el medio para realizar un seguimiento eficiente del elemento medio del conjunto múltiple.
  • Si el elemento recién agregado es más pequeño que el elemento intermedio anterior , mueva mid a su elemento más pequeño inmediato. De lo contrario, mueva mid a su siguiente elemento inmediato.
  • Calcule el costo de reemplazar cada elemento del subarreglo por la ecuación | A[i] – mediana de cada_subarreglo | .
  • Finalmente imprima el costo total.

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

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the minimum
// cost to convert each element of
// every subarray of size K equal
int minimumCost(vector<int> arr, int n,
                int k)
{
    // Stores the minimum cost
    int totalcost = 0;
    int i, j;
 
    // Stores the first K elements
    multiset<int> mp(arr.begin(),
                     arr.begin() + k);
 
    if (k == n) {
 
        // Obtain the middle element of
        // the multiset
        auto mid = next(mp.begin(),
                        n / 2 - ((k + 1) % 2));
 
        int z = *mid;
 
        // Calculate cost for the subarray
        for (i = 0; i < n; i++)
            totalcost += abs(z - arr[i]);
 
        // Return the total cost
        return totalcost;
    }
    else {
 
        // Obtain the middle element
        // in multiset
        auto mid = next(mp.begin(),
                        k / 2 - ((k + 1) % 2));
 
        for (i = k; i < n; i++) {
 
            int zz = *mid;
            int cost = 0;
            for (j = i - k; j < i; j++) {
 
                // Cost for the previous
                // k length subarray
                cost += abs(arr[j] - zz);
            }
            totalcost += cost;
 
            // Insert current element
            // into multiset
            mp.insert(arr[i]);
 
            if (arr[i] < *mid) {
 
                // New element appears
                // to the left of mid
                mid--;
            }
 
            if (arr[i - k] <= *mid) {
 
                // New element appears
                // to the right of mid
                mid++;
            }
 
            // Remove leftmost element
            // from the window
            mp.erase(mp.lower_bound(arr[i - k]));
 
            // For last element
            if (i == n - 1) {
                zz = *mid;
                cost = 0;
 
                for (j = i - k + 1;
                     j <= i; j++) {
 
                    // Calculate cost for the subarray
                    cost += abs(zz - arr[j]);
                }
 
                totalcost += cost;
            }
        }
 
        // Return the total cost
        return totalcost;
    }
}
 
// Driver Code
int main()
{
    int N = 5, K = 3;
 
    vector<int> A({ 1, 2, 3, 4, 6 });
 
    cout << minimumCost(A, N, K);
}
Producción: 

7

 

Complejidad temporal: O(NlogN) 
Espacio auxiliar: O(1)
 

Publicación traducida automáticamente

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