Minimice los movimientos para hacer que los elementos de Array sean iguales incrementando y decrementando pares

Dada una array arr[] de tamaño N, la tarea es imprimir el número mínimo de movimientos necesarios para igualar todos los elementos de la array seleccionando dos índices distintos y luego incrementar el elemento en el primer índice seleccionado y disminuir el elemento en el otro. índice seleccionado por 1 en cada movimiento. Si es imposible hacer que todos los elementos de la array sean iguales, imprima » -1 «.

Ejemplos

Entrada: arr[] = {5, 4, 1, 10}
Salida: 5
Explicación: 
Una de las formas posibles de realizar la operación es:
Operación 1: Seleccione los índices 1 y 3 y luego incremente arr[1] en 1 y disminuya arr[3] por 1. A partir de entonces, la array se modifica a {5, 5, 1, 9}.
Operación 2: seleccione los índices 2 y 3 y luego incremente arr[2] en 1 y disminuya arr[3] en 1. A partir de entonces, la array se modifica a {5, 5, 2, 8}.
Operación 3: seleccione los índices 2 y 3 y luego incremente arr[2] en 1 y disminuya arr[3] en 1. A partir de entonces, la array se modifica a {5, 5, 3, 7}.
Operación 4: seleccione los índices 2 y 3 y luego incremente arr[2] en 1 y disminuya arr[3] en 1. A partir de entonces, la array se modifica a {5, 5, 4, 6}.
Operación 5: seleccione los índices 2 y 3 y luego incremente arr[2] en 1 y disminuya arr[3] en 1. A partir de entonces, la array se modifica a {5, 5, 5, 5}.
Por lo tanto, el número total de movimientos necesarios es 5. Además, es el mínimo posible de movimientos necesarios.

Entrada: arr[] = {1, 4}
Salida: -1

Enfoque: El problema dado se puede resolver con base en las siguientes observaciones: 

  • Se puede observar que en un movimiento la suma de la array sigue siendo la misma, por lo tanto, si la suma de la array no es divisible por N , entonces es imposible hacer que todos los elementos de la array sean iguales.
  • De lo contrario, cada elemento de la array será igual a la suma de la array dividida por N.
  • Por lo tanto, la idea es usar la técnica de dos punteros para encontrar el número mínimo de movimientos necesarios para que todos los elementos del arreglo sean iguales a la suma/N .

Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos ans como 0 , para almacenar el recuento de los movimientos necesarios.
  • Encuentre la suma de la array y guárdela en una variable, digamos sum .
  • Ahora, si la suma no es divisible por N , imprima » -1 «. De lo contrario, actualice la suma como sum =sum/N.
  • Ordene la array en orden ascendente.
  • Inicialice las variables, diga i como 0 y j como N – 1 para iterar sobre la array.
  • Iterar hasta que i sea menor que j y realizar los siguientes pasos:
    • Si aumentar arr[i] a sum es menor que disminuir arr[j] a sum , agregue sum – arr[i] a ans y luego actualice arr[i] y arr[j] y luego incremente i en 1 .
    • De lo contrario, agregue arr[j] – sum a ans y actualice arr[i] y arr[j] y luego disminuya j en 1.
  • Finalmente, después de completar los pasos anteriores, imprima el valor de almacenado en ans .

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

C++

// C++ Program for the above approach
#include <algorithm>
#include <iostream>
using namespace std;
 
// Function to find the minimum
// operations to make the array
// elements equal
int find(int arr[], int N)
{
  // Stores the sum of the
  // array
  int Sum = 0;
  for (int i = 0; i < N; i++) {
    Sum += arr[i];
  }
  if (Sum % N) {
    return -1;
  }
 
  // update sum
  Sum /= N;
 
  // sort array
  sort(arr, arr + N);
 
  // Store the minimum
  // needed moves
  int ans = 0;
  int i = 0, j = N - 1;
 
  // Iterate until i
  // is less than j
  while (i < j) {
    if (Sum - arr[i] < arr[j] - Sum) {
 
      // Increment ans by
      // Sum-arr[i]
      ans += (Sum - arr[i]);
 
      // update
      arr[i] += (Sum - arr[i]);
      arr[j] -= (Sum - arr[i]);
 
      // Increment i by 1
      i++;
    }
    else {
 
      // Increment ans by
      //arr[j]-Sum
      ans += (arr[j] - Sum);
 
      // Update
      arr[i] += (arr[j] - Sum);
      arr[j] -= (arr[j] - Sum);
 
      // Decrement j by 1
      j--;
    }
  }
 
  // Return the value in ans
  return ans;
}
 
// Driver code
int main()
{
 
  // Given input
  int arr[] = { 5, 4, 1, 10 };
  int N = sizeof(arr) / sizeof(int);
 
  // Function call
  cout << find(arr, N);
  return 0;
}
 
// This code is contributed by Parth Manchanda

Java

import java.util.Arrays;
 
// Java Program for the above approach
 
class GFG {
 
    // Function to find the minimum
    // operations to make the array
    // elements equal
    public static int find(int arr[], int N)
    {
       
        // Stores the sum of the
        // array
        int Sum = 0;
        for (int i = 0; i < N; i++) {
            Sum += arr[i];
        }
        if (Sum % N > 0) {
            return -1;
        }
 
        // update sum
        Sum /= N;
 
        // sort array
        Arrays.sort(arr);
 
        // Store the minimum
        // needed moves
        int ans = 0;
        int i = 0, j = N - 1;
 
        // Iterate until i
        // is less than j
        while (i < j) {
            if (Sum - arr[i] < arr[j] - Sum) {
 
                // Increment ans by
                // Sum-arr[i]
                ans += (Sum - arr[i]);
 
                // update
                arr[i] += (Sum - arr[i]);
                arr[j] -= (Sum - arr[i]);
 
                // Increment i by 1
                i++;
            } else {
 
                // Increment ans by
                // arr[j]-Sum
                ans += (arr[j] - Sum);
 
                // Update
                arr[i] += (arr[j] - Sum);
                arr[j] -= (arr[j] - Sum);
 
                // Decrement j by 1
                j--;
            }
        }
 
        // Return the value in ans
        return ans;
    }
 
    // Driver code
    public static void main(String args[]) {
 
        // Given input
        int arr[] = { 5, 4, 1, 10 };
        int N = arr.length;
 
        // Function call
        System.out.println(find(arr, N));
 
    }
}
 
// This code is contributed by gfgking

Python3

# Python program for the above approach
 
# Function to find the minimum
# operations to make the array
# elements equal
def find(arr, N):
 
    # Stores the sum of the
    # array
    Sum = sum(arr)
 
    # If sum is not divisible
    # by N
    if Sum % N:
        return -1
    else:
 
       # Update sum
        Sum //= N
 
        # Sort the array
        arr.sort()
 
        # Store the minimum
        # needed moves
        ans = 0
 
        i = 0
        j = N-1
 
        # Iterate until i
        # is less than j
        while i < j:
 
            # If the Sum-arr[i]
            # is less than the
            # arr[j]-sum
            if Sum-arr[i] < arr[j]-Sum:
 
                # Increment ans by
                # Sum-arr[i]
                ans += Sum-arr[i]
 
                # Update
                arr[i] += Sum-arr[i]
                arr[j] -= Sum-arr[i]
 
                # Increment i by 1
                i += 1
                 
            # Otherwise,
            else:
 
                # Increment ans by
                # arr[j]-Sum
                ans += arr[j]-Sum
 
                # Update
                arr[i] += arr[j]-Sum
                arr[j] -= arr[j]-Sum
 
                # Decrement j by 1
                j -= 1
 
        # Return the value in ans
        return ans
 
# Driver Code
if __name__ == '__main__':
     
    # Given Input
    arr = [5, 4, 1, 10]
    N = len(arr)
     
    # Function Call
    print(find(arr, N))

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to find the minimum
// operations to make the array
// elements equal
public static int find(int[] arr, int N)
{
     
    // Stores the sum of the
    // array
    int Sum = 0;
    int i = 0;
     
    for(i = 0; i < N; i++)
    {
        Sum += arr[i];
    }
    if (Sum % N > 0)
    {
        return -1;
    }
 
    // update sum
    Sum /= N;
 
    // sort array
    Array.Sort(arr);
 
    // Store the minimum
    // needed moves
    int ans = 0;
    i = 0;
    int j = N - 1;
 
    // Iterate until i
    // is less than j
    while (i < j)
    {
        if (Sum - arr[i] < arr[j] - Sum)
        {
             
            // Increment ans by
            // Sum-arr[i]
            ans += (Sum - arr[i]);
 
            // update
            arr[i] += (Sum - arr[i]);
            arr[j] -= (Sum - arr[i]);
 
            // Increment i by 1
            i++;
        }
        else
        {
             
            // Increment ans by
            // arr[j]-Sum
            ans += (arr[j] - Sum);
 
            // Update
            arr[i] += (arr[j] - Sum);
            arr[j] -= (arr[j] - Sum);
 
            // Decrement j by 1
            j--;
        }
    }
 
    // Return the value in ans
    return ans;
}
 
// Driver code
static public void Main()
{
     
    // Given input
    int[] arr = { 5, 4, 1, 10 };
    int N = arr.Length;
 
    // Function call
    Console.WriteLine(find(arr, N));
}
}
 
// This code is contributed by target_2

Javascript

<script>
 
        // JavaScript Program for the above approach
 
 
        // Function to find the minimum
        // operations to make the array
        // elements equal
        function find(arr, N) {
 
            // Stores the sum of the
            // array
            let Sum = 0;
 
            for (i = 0; i < arr.length; i++) {
                Sum = Sum + arr[i];
            }
 
            // If sum is not divisible
            // by N
            if (Sum % N)
                return -1;
            else {
 
                // Update sum
                Sum = Math.floor(Sum / N);
 
                // Sort the array
                arr.sort(function (a, b) { return a - b });
 
                // Store the minimum
                // needed moves
                ans = 0
 
                i = 0
                j = N - 1
 
                // Iterate until i
                // is less than j
                while (i < j) {
 
                    // If the Sum-arr[i]
                    // is less than the
                    // arr[j]-sum
                    if (Sum - arr[i] < arr[j] - Sum) {
 
                        // Increment ans by
                        // Sum-arr[i]
                        ans += Sum - arr[i]
 
                        // Update
                        arr[i] += Sum - arr[i]
                        arr[j] -= Sum - arr[i]
 
                        // Increment i by 1
                        i += 1
                    }
                    // Otherwise,
                    else {
 
                        // Increment ans by
                        // arr[j]-Sum
                        ans += arr[j] - Sum
 
                        // Update
                        arr[i] += arr[j] - Sum
                        arr[j] -= arr[j] - Sum
 
                        // Decrement j by 1
                        j -= 1
                    }
 
                }
            }
            // Return the value in ans
            return ans;
 
        }
 
        // Driver Code
 
 
        // Given Input
        let arr = [5, 4, 1, 10];
        let N = arr.length;
 
        // Function Call
        document.write(find(arr, N));
 
 
    // This code is contributed by Potta Lokesh
     
</script>
Producción

5

Complejidad de tiempo: O(N*log(N))
Espacio auxiliar: O(1)

Publicación traducida automáticamente

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