Dada una array de n elementos. Considere la array como una array circular, es decir, el elemento después de una n es un 1 . La tarea es encontrar la suma máxima de la diferencia entre elementos consecutivos con la reorganización del elemento de la array permitida, es decir, después de la reorganización del elemento, encuentre |a 1 – a 2 | + |a 2 – a 3 | + …… + |una norte – 1 – una norte | + |una n – una 1 |.
Ejemplos:
Input : arr[] = { 4, 2, 1, 8 } Output : 18 Rearrange given array as : { 1, 8, 2, 4 } Sum of difference between consecutive element = |1 - 8| + |8 - 2| + |2 - 4| + |4 - 1| = 7 + 6 + 2 + 3 = 18. Input : arr[] = { 10, 12, 15 } Output : 10
La idea es usar Greedy Approach y tratar de acercar los elementos que tienen una mayor diferencia.
Considere la permutación ordenada de la array dada a 1 , a 1 , a 2 ,…., a n – 1 , a n tal que a 1 < a 2 < a 3 …. < un norte – 1 < un norte .
Ahora, para obtener la respuesta con la máxima suma de diferencias entre elementos consecutivos, organice los elementos de la siguiente manera:
a 1 , a n , a 2 , a n-1 ,…., a n/2 , a (n/2) + 1
Podemos observar que el arreglo produce la respuesta óptima, ya que todos los a 1 , a 2 , a 3 ,….., a (n/2)-1 , a n/2 se restan dos veces mientras que a (n/2)+ 1 , a (n/2)+2 , a (n/2)+3 ,….., a n – 1 , a n se suman dos veces.
Nota: a (n/2)+1 Este término se considera solo para n pares porque para n impares, se suma una vez y se resta una vez y, por lo tanto, se cancela.
Implementación:
C++
// C++ program to maximize the sum of difference // between consecutive elements in circular array #include <bits/stdc++.h> using namespace std; // Return the maximum Sum of difference between // consecutive elements. int maxSum(int arr[], int n) { int sum = 0; // Sorting the array. sort(arr, arr + n); // Subtracting a1, a2, a3,....., a(n/2)-1, an/2 // twice and adding a(n/2)+1, a(n/2)+2, a(n/2)+3,. // ...., an - 1, an twice. for (int i = 0; i < n/2; i++) { sum -= (2 * arr[i]); sum += (2 * arr[n - i - 1]); } return sum; } // Driver Program int main() { int arr[] = { 4, 2, 1, 8 }; int n = sizeof(arr)/sizeof(arr[0]); cout << maxSum(arr, n) << endl; return 0; }
Java
// Java program to maximize the sum of difference // between consecutive elements in circular array import java.io.*; import java.util.Arrays; class MaxSum { // Return the maximum Sum of difference between // consecutive elements. static int maxSum(int arr[], int n) { int sum = 0; // Sorting the array. Arrays.sort(arr); // Subtracting a1, a2, a3,....., a(n/2)-1, // an/2 twice and adding a(n/2)+1, a(n/2)+2, // a(n/2)+3,....., an - 1, an twice. for (int i = 0; i < n/2; i++) { sum -= (2 * arr[i]); sum += (2 * arr[n - i - 1]); } return sum; } // Driver Program public static void main (String[] args) { int arr[] = { 4, 2, 1, 8 }; int n = arr.length; System.out.println(maxSum(arr, n)); } } /*This code is contributed by Prakriti Gupta*/
Python3
# Python3 program to maximize the sum of difference # between consecutive elements in circular array # Return the maximum Sum of difference # between consecutive elements def maxSum(arr, n): sum = 0 # Sorting the array arr.sort() # Subtracting a1, a2, a3,....., a(n/2)-1, an/2 # twice and adding a(n/2)+1, a(n/2)+2, a(n/2)+3,. # ...., an - 1, an twice. for i in range(0, int(n / 2)) : sum -= (2 * arr[i]) sum += (2 * arr[n - i - 1]) return sum # Driver Program arr = [4, 2, 1, 8] n = len(arr) print (maxSum(arr, n)) # This code is contributed by Shreyanshi Arun.
C#
// C# program to maximize the sum of difference // between consecutive elements in circular array using System; class MaxSum { // Return the maximum Sum of difference // between consecutive elements. static int maxSum(int[] arr, int n) { int sum = 0; // Sorting the array. Array.Sort(arr); // Subtracting a1, a2, a3, ....., a(n/2)-1, // an/2 twice and adding a(n/2)+1, a(n/2)+2, // a(n/2)+3, ....., an - 1, an twice. for (int i = 0; i < n / 2; i++) { sum -= (2 * arr[i]); sum += (2 * arr[n - i - 1]); } return sum; } // Driver Program public static void Main() { int[] arr = { 4, 2, 1, 8 }; int n = arr.Length; Console.WriteLine(maxSum(arr, n)); } } //This Code is contributed by vt_m.
Javascript
<script> // JavaScript program for the above approach // Return the maximum Sum of difference between // consecutive elements. function maxSum(arr, n) { let sum = 0; // Sorting the array. arr.sort(); // Subtracting a1, a2, a3,....., a(n/2)-1, // an/2 twice and adding a(n/2)+1, a(n/2)+2, // a(n/2)+3,....., an - 1, an twice. for (let i = 0; i < n/2; i++) { sum -= (2 * arr[i]); sum += (2 * arr[n - i - 1]); } return sum; } // Driver Code let arr = [ 4, 2, 1, 8 ]; let n = arr.length; document.write(maxSum(arr, n)); // This code is contributed by chinmoy1997pal. </script>
18
Complejidad de tiempo: O (nlogn).
Espacio Auxiliar : O(1)
Este artículo es una contribución de Anuj Chauhan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA