Dada una array A[] que consta de N enteros ( indexación basada en 1 ), la tarea es encontrar el valor mínimo de la función para cualquier valor posible de X.
Ejemplos:
Entrada: A[] = {1, 2, 3, 4}
Salida: 0
Explicación:
Considere el valor de X como 0, entonces el valor de la función dada es (1 – 1 + 2 – 2 + 3 – 3 + 4 – 4) = 0, que es el mínimo.Entrada: A[] = {5, 3, 9}
Salida: 5
Enfoque: El problema dado se puede resolver con base en las siguientes observaciones:
- Considere una función como (B[i] = A[i] − i) , luego para minimizar el valor de , la idea es elegir el valor de X como la mediana de la array B[] tal que la suma se minimice.
Siga los pasos para resolver el problema:
- Inicialice una array, digamos B[] que almacena el valor de (A[i] – i) para cada valor posible de la array A[] .
- Recorra la array dada A[] y para cada índice i , actualice el valor de B[i] como (A[i] – i) .
- Ordene la array B[] en orden ascendente y encuentre el valor X como la mediana de la array B[] .
- Después de completar los pasos anteriores, encuentre el valor de la función dada para el valor calculado de X .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find minimum value of // the given function int minimizeFunction(int A[], int N) { // Stores the value of A[i] - i int B[N]; // Traverse the given array A[] for (int i = 0; i < N; i++) { // Update the value of B[i] B[i] = A[i] - i - 1; } // Sort the array B[] sort(B, B + N); // Calculate the median of the // array B[] int median = (B[int(floor((N - 1) / 2.0))] + B[int(ceil((N - 1) / 2.0))]) / 2; // Stores the minimum value of // the function int minValue = 0; for (int i = 0; i < N; i++) { // Update the minValue minValue += abs(A[i] - (median + i + 1)); } // Return the minimum value return minValue; } // Driver Code int main() { int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int N = sizeof(A) / sizeof(A[0]); cout << minimizeFunction(A, N); return 0; }
Java
/*package whatever //do not write package name here */ import java.io.*; import java.lang.Math; import java.util.*; class GFG { public static int minimizeFunction(int A[], int N) { // Stores the value of A[i] - i int B[] = new int[N]; // Traverse the given array A[] for (int i = 0; i < N; i++) { // Update the value of B[i] B[i] = A[i] - i - 1; } // Sort the array B[] Arrays.sort(B); // Calculate the median of the // array B[] int median = (B[(int)(Math.floor((N - 1) / 2.0))] + B[(int)(Math.ceil((N - 1) / 2.0))]) / 2; // Stores the minimum value of // the function int minValue = 0; for (int i = 0; i < N; i++) { // Update the minValue minValue += Math.abs(A[i] - (median + i + 1)); } // Return the minimum value return minValue; } public static void main(String[] args) { int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int N = A.length; System.out.println(minimizeFunction(A, N)); } } // This code is contributed by sam_2200.
Python3
# Python3 program for the above approach from math import floor, ceil # Function to find minimum value of # the given function def minimizeFunction(A, N): # Stores the value of A[i] - i B = [0] * N # Traverse the given array A[] for i in range(N): # Update the value of B[i] B[i] = A[i] - i - 1 # Sort the array B[] B = sorted(B) # Calculate the median of the # array B[] x, y = int(floor((N - 1) / 2.0)), int(ceil((N - 1) / 2.0)) median = (B[x] + B[y]) / 2 # Stores the minimum value of # the function minValue = 0 for i in range(N): # Update the minValue minValue += abs(A[i] - (median + i + 1)) # Return the minimum value return int(minValue) # Driver Code if __name__ == '__main__': A = [1, 2, 3, 4, 5, 6, 7, 8, 9] N = len(A) print(minimizeFunction(A, N)) # This code is contributed by mohit kumar 29
C#
// C# program for the above approach using System; class GFG { public static int minimizeFunction(int[] A, int N) { // Stores the value of A[i] - i int[] B = new int[N]; // Traverse the given array A[] for (int i = 0; i < N; i++) { // Update the value of B[i] B[i] = A[i] - i - 1; } // Sort the array B[] Array.Sort(B); // Calculate the median of the // array B[] int median = (B[(int)(Math.Floor((N - 1) / 2.0))] + B[(int)(Math.Ceiling((N - 1) / 2.0))]) / 2; // Stores the minimum value of // the function int minValue = 0; for (int i = 0; i < N; i++) { // Update the minValue minValue += Math.Abs(A[i] - (median + i + 1)); } // Return the minimum value return minValue; } static void Main() { int []A = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int N = A.Length; Console.WriteLine(minimizeFunction(A, N)); } } // This code is contributed by SoumikMondal.
Javascript
<script> // Javascript program for the above approach function minimizeFunction(A, N){ // Stores the value of A[i] - i let B = Array.from({length: N}, (_, i) => 0); // Traverse the given array A[] for (let i = 0; i < N; i++) { // Update the value of B[i] B[i] = A[i] - i - 1; } // Sort the array B[] B.sort(); // Calculate the median of the // array B[] let median = (B[(Math.floor((N - 1) / 2.0))] + B[(Math.ceil((N - 1) / 2.0))]) / 2; // Stores the minimum value of // the function let minValue = 0; for (let i = 0; i < N; i++) { // Update the minValue minValue += Math.abs(A[i] - (median + i + 1)); } // Return the minimum value return minValue; } // Driver Code let A = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; let N = A.length; document.write(minimizeFunction(A, N)); </script>
0
Complejidad de tiempo: O(N * log N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por kapil16garg y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA