Dada una array arr[] de tamaño N y un entero positivo K , la tarea es encontrar el costo mínimo posible para dividir la array en K subconjuntos , donde el costo del i -ésimo elemento ( indexación basada en 1 ) de cada subconjunto es igual al producto de ese elemento y i .
Ejemplos:
Entrada: arr[] = { 2, 3, 4, 1 }, K = 3
Salida: 11
Explicación:
Divida la array arr[] en K(= 3) subconjuntos { { 4, 1 }, { 2 }, { 3 } }
Costo total del 1er subconjunto = 4 * 1 + 1 * 2 = 6
Costo total del 2do subconjunto = 2 * 1 = 2
Costo total del 3er subconjunto = 3 * 1 = 3
Por lo tanto, el costo total de K(= 3) subconjuntos es 6 + 2 + 3 = 11.Entrada: arr[] = { 9, 20, 7, 8 }, K=2
Salida: 59
Explicación:
Dividir la array arr[] en K(= 3) subconjuntos { { 20, 8 }, { 9, 7 } }
Costo total del primer subconjunto = 20 * 1 + 8 * 2 = 36
Costo total del segundo subconjunto = 9 * 1 + 7 * 2 = 23
Por lo tanto, el costo total de K(= 3) subconjuntos es 36 + 23 = 59
Enfoque: El problema se puede resolver usando la técnica Greedy . La idea es dividir los elementos de la array de modo que todos los elementos en los subconjuntos respectivos estén en orden decreciente. Siga los pasos a continuación para resolver el problema:
- Ordena la array dada en orden descendente .
- Inicialice una variable, digamos totalCost , para almacenar el costo mínimo para dividir la array en K subconjuntos.
- Inicialice una variable, digamos X , para almacenar la posición de un elemento en un subconjunto.
- Iterar sobre el rango [1, N] usando la variable i . Para cada i -ésima operación, incremente el valor de totalCost en ((arr[i]+ …+ arr[i + K]) * X) y actualice i = i + K , X += 1 .
- Finalmente, imprima el valor de totalCost .
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 // split array into K subsets int getMinCost(int* arr, int n, int k) { // Sort the array in descending order sort(arr, arr + n, greater<int>()); // Stores minimum cost to split // the array into K subsets int min_cost = 0; // Stores position of // elements of a subset int X = 0; // Iterate over the range [1, N] for (int i = 0; i < n; i += k) { // Calculate the cost to select // X-th element of every subset for (int j = i; j < i + k && j < n; j++) { // Update min_cost min_cost += arr[j] * (X + 1); } // Update X X++; } return min_cost; } // Driver Code int main() { int arr[] = { 9, 20, 7, 8 }; int K = 2; int N = sizeof(arr) / sizeof(arr[0]); // Function call cout << getMinCost(arr, N, K) << endl; }
Java
// Java program to implement // the above approach import java.util.*; class GFG { // reverses an array static void reverse(int a[], int n) { int i, k, t; for (i = 0; i < n / 2; i++) { t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } } // Function to find the minimum cost to // split array into K subsets static int getMinCost(int[] arr, int n, int k) { // Sort the array in descending order Arrays.sort(arr); reverse(arr, n); // Stores minimum cost to split // the array into K subsets int min_cost = 0; // Stores position of // elements of a subset int X = 0; // Iterate over the range [1, N] for (int i = 0; i < n; i += k) { // Calculate the cost to select // X-th element of every subset for (int j = i; j < i + k && j < n; j++) { // Update min_cost min_cost += arr[j] * (X + 1); } // Update X X++; } return min_cost; } // Driver code public static void main(String[] args) { int arr[] = { 9, 20, 7, 8 }; int K = 2; int N = arr.length; // Function call System.out.println( getMinCost(arr, N, K)); } } // This code is contributed by susmitakundugoaldanga
Python3
# Python program to implement # the above approach # Function to find the minimum cost to # split array into K subsets def getMinCost(arr, n, k): # Sort the array in descending order arr.sort(reverse = True) # Stores minimum cost to split # the array into K subsets min_cost = 0; # Stores position of # elements of a subset X = 0; # Iterate over the range [1, N] for i in range(0, n, k): # Calculate the cost to select # X-th element of every subset for j in range(i, n, 1): # Update min_cost if(j < i + k): min_cost += arr[j] * (X + 1); # Update X X += 1; return min_cost; # Driver code if __name__ == '__main__': arr = [9, 20, 7, 8]; K = 2; N = len(arr); # Function call print(getMinCost(arr, N, K)); # This code is contributed by 29AjayKumar
C#
// C# program to implement // the above approach using System; class GFG { // reverses an array static void reverse(int []a, int n) { int i, k, t; for (i = 0; i < n / 2; i++) { t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } } // Function to find the minimum cost to // split array into K subsets static int getMinCost(int[] arr, int n, int k) { // Sort the array in descending order Array.Sort(arr); reverse(arr, n); // Stores minimum cost to split // the array into K subsets int min_cost = 0; // Stores position of // elements of a subset int X = 0; // Iterate over the range [1, N] for (int i = 0; i < n; i += k) { // Calculate the cost to select // X-th element of every subset for (int j = i; j < i + k && j < n; j++) { // Update min_cost min_cost += arr[j] * (X + 1); } // Update X X++; } return min_cost; } // Driver code public static void Main(String[] args) { int []arr = { 9, 20, 7, 8 }; int K = 2; int N = arr.Length; // Function call Console.WriteLine( getMinCost(arr, N, K)); } } // This code is contributed by shikhasingrajput
Javascript
<script> // JavaScript program to implement // the above approach // Reverses an array function reverse(a, n) { var i, k, t; for(i = 0; i < n / 2; i++) { t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } } // Function to find the minimum cost to // split array into K subsets function getMinCost(arr, n, k) { // Sort the array in descending order arr.sort((a, b) => b - a); // Stores minimum cost to split // the array into K subsets var min_cost = 0; // Stores position of // elements of a subset var X = 0; // Iterate over the range [1, N] for(var i = 0; i < n; i += k) { // Calculate the cost to select // X-th element of every subset for(var j = i; j < i + k && j < n; j++) { // Update min_cost min_cost += arr[j] * (X + 1); } // Update X X++; } return min_cost; } // Driver code var arr = [ 9, 20, 7, 8 ]; var K = 2; var N = arr.length; // Function call document.write(getMinCost(arr, N, K)); // This code is contributed by rdtank </script>
59
Complejidad de tiempo: O(N * log(N))
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por bolliranadheer y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA