Dado un número entero N y una array arr[] que consta de 3 * N enteros, la tarea es encontrar la diferencia máxima entre la primera mitad y la segunda mitad de la array después de eliminar exactamente N elementos de la array.
Ejemplos:
Entrada: N = 2, arr[] = {3, 1, 4, 1, 5, 9}
Salida: 1
Explicación:
La eliminación de arr[1] y arr[5] del arreglo maximiza la diferencia = (3 + 4 ) – (1 + 5) = 7 – 6 = 1.Entrada: N = 1, arr[] = {1, 2, 3}
Salida: -1
Enfoque:
siga los pasos que se indican a continuación para resolver el problema
- Recorra la array desde el principio y siga actualizando la suma de los N elementos más grandes desde el principio de la array.
- Del mismo modo, siga actualizando la suma de los N elementos más pequeños desde el final de la array.
- Recorra estas sumas y calcule las diferencias en cada punto y actualice la máxima diferencia obtenida.
- Imprime la diferencia máxima obtenida.
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 print the maximum difference // possible between the two halves of the array long long FindMaxDif(vector<long long> a, int m) { int n = m / 3; vector<long long> l(m + 5), r(m + 5); // Stores n maximum values from the start multiset<long long> s; for (int i = 1; i <= m; i++) { // Insert first n elements if (i <= n) { // Update sum of largest n // elements from left l[i] = a[i - 1] + l[i - 1]; s.insert(a[i - 1]); } // For the remaining elements else { l[i] = l[i - 1]; // Obtain minimum value // in the set long long d = *s.begin(); // Insert only if it is greater // than minimum value if (a[i - 1] > d) { // Update sum from left l[i] -= d; l[i] += a[i - 1]; // Remove the minimum s.erase(s.find(d)); // Insert the current element s.insert(a[i - 1]); } } } // Clear the set s.clear(); // Store n minimum elements from the end for (int i = m; i >= 1; i--) { // Insert the last n elements if (i >= m - n + 1) { // Update sum of smallest n // elements from right r[i] = a[i - 1] + r[i + 1]; s.insert(a[i - 1]); } // For the remaining elements else { r[i] = r[i + 1]; // Obtain the minimum long long d = *s.rbegin(); // Insert only if it is smaller // than maximum value if (a[i - 1] < d) { // Update sum from right r[i] -= d; r[i] += a[i - 1]; // Remove the minimum s.erase(s.find(d)); // Insert the new element s.insert(a[i - 1]); } } } long long ans = -9e18L; for (int i = n; i <= m - n; i++) { // Compare the difference and // store the maximum ans = max(ans, l[i] - r[i + 1]); } // Return the maximum // possible difference return ans; } // Driver Code int main() { vector<long long> vtr = { 3, 1, 4, 1, 5, 9 }; int n = vtr.size(); cout << FindMaxDif(vtr, n); return 0; }
Python3
# Python3 Program to implement # the above approach # Function to print the maximum difference # possible between the two halves of the array def FindMaxDif(a, m) : n = m // 3 l = [0] * (m + 5) r = [0] * (m + 5) # Stores n maximum values from the start s = [] for i in range(1, m + 1) : # Insert first n elements if (i <= n) : # Update sum of largest n # elements from left l[i] = a[i - 1] + l[i - 1] s.append(a[i - 1]) # For the remaining elements else : l[i] = l[i - 1] # Obtain minimum value # in the set s.sort() d = s[0] # Insert only if it is greater # than minimum value if (a[i - 1] > d) : # Update sum from left l[i] -= d l[i] += a[i - 1] # Remove the minimum s.remove(d) # Insert the current element s.append(a[i - 1]) # Clear the set s.clear() # Store n minimum elements from the end for i in range(m, 0, -1) : # Insert the last n elements if (i >= m - n + 1) : # Update sum of smallest n # elements from right r[i] = a[i - 1] + r[i + 1] s.append(a[i - 1]) # For the remaining elements else : r[i] = r[i + 1] s.sort() # Obtain the minimum d = s[-1] # Insert only if it is smaller # than maximum value if (a[i - 1] < d) : # Update sum from right r[i] -= d r[i] += a[i - 1] # Remove the minimum s.remove(d) # Insert the new element s.append(a[i - 1]) ans = -9e18 for i in range(n, m - n + 1) : # Compare the difference and # store the maximum ans = max(ans, l[i] - r[i + 1]) # Return the maximum # possible difference return ans # Driver code vtr = [ 3, 1, 4, 1, 5, 9 ] n = len(vtr) print(FindMaxDif(vtr, n)) # This code is contributed by divyesh072019
C#
// C# program to implement // the above approach using System; using System.Collections.Generic; class GFG{ // Function to print the maximum difference // possible between the two halves of the array static long FindMaxDif(List<long> a, int m) { int n = m / 3; long[] l = new long[m + 5]; long[] r = new long[m + 5]; // Stores n maximum values from the start List<long> s = new List<long>(); for(int i = 1; i <= m; i++) { // Insert first n elements if (i <= n) { // Update sum of largest n // elements from left l[i] = a[i - 1] + l[i - 1]; s.Add(a[i - 1]); } // For the remaining elements else { l[i] = l[i - 1]; s.Sort(); // Obtain minimum value // in the set long d = s[0]; // Insert only if it is greater // than minimum value if (a[i - 1] > d) { // Update sum from left l[i] -= d; l[i] += a[i - 1]; // Remove the minimum s.Remove(d); // Insert the current element s.Add(a[i - 1]); } } } // Clear the set s.Clear(); // Store n minimum elements from the end for(int i = m; i >= 1; i--) { // Insert the last n elements if (i >= m - n + 1) { // Update sum of smallest n // elements from right r[i] = a[i - 1] + r[i + 1]; s.Add(a[i - 1]); } // For the remaining elements else { r[i] = r[i + 1]; s.Sort(); // Obtain the minimum long d = s[s.Count - 1]; // Insert only if it is smaller // than maximum value if (a[i - 1] < d) { // Update sum from right r[i] -= d; r[i] += a[i - 1]; // Remove the minimum s.Remove(d); // Insert the new element s.Add(a[i - 1]); } } } long ans = (long)(-9e18); for(int i = n; i <= m - n; i++) { // Compare the difference and // store the maximum ans = Math.Max(ans, l[i] - r[i + 1]); } // Return the maximum // possible difference return ans; } // Driver Code static void Main() { List<long> vtr = new List<long>( new long[]{ 3, 1, 4, 1, 5, 9 }); int n = vtr.Count; Console.Write(FindMaxDif(vtr, n)); } } // This code is contributed by divyeshrabadiya07
1
Complejidad temporal: O(NlogN)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por rohitpal210 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA