Minimice el desplazamiento de la mitad de cada elemento a ambos lados para reducir Array

Dada una array arr[] de tamaño N , la tarea es encontrar el número mínimo de pasos necesarios para reducir todos los elementos de la array a 0 excepto el primero y el último, donde en cada paso:

  • Elija cualquier índice i (0<i<N-1) y disminuya el elemento en ese índice (arr[i]) en 2
  • Luego incremente dos elementos cualquiera, arr[j], donde 0<=j<i y arr[k], donde i<k<n, en 1.

Si no es posible reducir la array dada como se desea, devuelva -1.

Entrada: arr[] = {2, 3, 3, 4, 7}
Salida: 6
Explicación: Considere los siguientes pasos como cómo se realizará la reducción

array de pasos
0 {2, 3, 3, 4, 7} array original
1 {2, 4, 1, 4, 8} restar 2 de a[2] agregarlo a a[1] y a[4]
2 {3 , 2, 2, 4, 8} restar 2 de a[1] sumarlo a[0] y a[2]
3 {4, 0, 2, 4, 9} restar 2 de a[1] sumarlo a a[0] y a[4]
4 {5, 0, 0, 4, 10} restar 2 de a[2] sumarlo a a[0] y a[4]
5 {6, 0, 0, 2, 11} restar 2 de a[3] sumarlo a a[0] y a[4]
6 {7, 0, 0, 0, 12} restar 2 de a[3] sumarlo a a[0] y a[ 4]

Entrada : arr[] = {3,2,1,3,5,4}
Salida : 7

 

Acercarse: 

Intuición: el problema anterior se puede resolver con la ayuda de las siguientes observaciones:

  • Caso 1: A[i] es par
    • Como siempre restamos 2 de a[i], esto significa que a[i] debe ser un número par , de lo contrario, después de restar 2 cierto número de veces, quedará 1 sobre el cual no se podrá realizar ninguna operación más.
  • Caso 2: A[i] es impar
    • Entonces, para hacer que cada elemento sea 0, necesitamos tener números pares, y si no tenemos números pares, entonces tenemos que hacerlo par .
    • Cuando restamos 2 de a[i], seleccionamos i tal que arr[i] es par y arr[j] y/o arr[k] son ​​impares .
    • Así que sumando 1 a ellos hará entonces un número par.
  • Caso 3: Si no hay elemento impar
    • Si no tenemos ningún número impar, podemos elegir el primer y el último elemento y sumar directamente 1 a a[0] y a[n-1] ya que no tenemos que reducir estos elementos.

Ilustración 1:

Supongamos que tenemos {3,2,1,3,5,4}, 

Paso 1: hay un elemento impar en la array. Así que elija el primer elemento impar en el rango de índice (0, N-1), es decir, a[2] = 1.
              Tomamos 2 de a[1], agregamos 1 a a[0] y 1 a a[2].
              Entonces la array se convierte en {4, 0, 2, 3, 5, 4}, y nuestro 1 se convierte en 2, que ahora es un número par. 

Paso 2: Ahora considere el siguiente número impar en el rango (0, N-1), es decir, a[3] = 3.
              Tomamos 2 de a[2], agregamos 1 a a[0] y 1 a a[2]. 

             Entonces la array se convierte en {5, 0, 0, 4, 5, 4}, y nuestro 3 se convierte en 4, que ahora es un número par. 

Paso 3: Ahora considere el siguiente número impar en el rango (0, N-1), es decir, a[4] = 5.
              Tomamos 2 de a[3], agregamos 1 a a[0] y 1 a a[4].

             Entonces la array se convierte en {6, 0, 0, 2, 6, 4}, y nuestro 5 se convierte en 6, que ahora es un número par. 

Paso 4 – 7: tomamos 2 de cada número par, es decir, 2 y 6, y lo cambiamos a a[0] y a[n-1]
              Como en cada paso podemos reducirlo en 2, por lo que necesitaremos 1 paso para el elemento 2 y 3 pasos para el elemento 6.

Por lo tanto, las operaciones totales se convierten en 7 y, finalmente, la array se convierte en {10, 0, 0, 0, 0, 8}.

Ilustración 2:

Ahora, si solo tenemos 3 elementos y el valor medio es un número impar,
entonces la respuesta no es posible porque la única selección posible es j=0,i=1 y k=2.

Entonces, después de restar 2, un cierto número de veces a[i] se convertirá en 1. 

Entonces, en este caso, no es posible una respuesta válida, y la respuesta será -1.

A continuación se muestra la implementación:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to shift the array
int stepsToRearrange(vector<int>& A, int n)
{
    // if A has 3 elements and
    // 2nd element is odd then
    // answer is not possible
    if (n == 3 && (A[1] % 2 == 1))
        return -1;
 
    int steps = 0, countOne = 0;
 
    // Select even numbers and subtract 2
    // Now for the odd number
    // we add one and make them even.
    // so total steps = (a[i]+1)/2
    for (int i = 1; i < n - 1; i++) {
        steps += (A[i] + 1) / 2;
        countOne += (A[i] == 1);
    }
 
    // If all numbers in index 1 to n-2 = 1
    // then answer is not possible
    if (countOne == n - 2)
        return -1;
 
    // return steps
    return steps;
}
 
// Driver Code
int main()
{
    vector<int> arr = { 3, 2, 1, 3, 5, 4 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    cout << stepsToRearrange(arr, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
class GFG {
 
  // Function to shift the array
  public static int stepsToRearrange(int A[], int n)
  {
 
    // if A has 3 elements and
    // 2nd element is odd then
    // answer is not possible
    if (n == 3 && (A[1] % 2 == 1))
      return -1;
 
    int steps = 0, countOne = 0;
 
    // Select even numbers and subtract 2
    // Now for the odd number
    // we add one and make them even.
    // so total steps = (a[i]+1)/2
    for (int i = 1; i < n - 1; i++) {
      steps += (A[i] + 1) / 2;
      if (A[i] == 1) {
        countOne += 1;
      }
    }
 
    // If all numbers in index 1 to n-2 = 1
    // then answer is not possible
    if (countOne == n - 2)
      return -1;
 
    // return steps
    return steps;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int arr[] = { 3, 2, 1, 3, 5, 4 };
    int N = arr.length;
 
    System.out.print(stepsToRearrange(arr, N));
  }
}
 
// This code is contributed by Taranpreet

Python3

# python3 program for the above approach
 
# Function to shift the array
def stepsToRearrange(A, n):
 
    # if A has 3 elements and
    # 2nd element is odd then
    # answer is not possible
    if (n == 3 and (A[1] % 2 == 1)):
        return -1
 
    steps, countOne = 0, 0
 
    # Select even numbers and subtract 2
    # Now for the odd number
    # we add one and make them even.
    # so total steps = (a[i]+1)/2
    for i in range(1, n-1):
        steps += (A[i] + 1) // 2
        countOne += (A[i] == 1)
 
    # If all numbers in index 1 to n-2 = 1
    # then answer is not possible
    if (countOne == n - 2):
        return -1
 
    # return steps
    return steps
 
# Driver Code
if __name__ == "__main__":
 
    arr = [3, 2, 1, 3, 5, 4]
    N = len(arr)
 
    print(stepsToRearrange(arr, N))
 
# This code is contributed by rakeshsahni

C#

// C# program for the above approach
using System;
class GFG {
 
    // Function to shift the array
    static int stepsToRearrange(int[] A, int n)
    {
        // if A has 3 elements and
        // 2nd element is odd then
        // answer is not possible
        if (n == 3 && (A[1] % 2 == 1))
            return -1;
 
        int steps = 0, countOne = 0;
 
        // Select even numbers and subtract 2
        // Now for the odd number
        // we add one and make them even.
        // so total steps = (a[i]+1)/2
        for (int i = 1; i < n - 1; i++) {
            steps += (A[i] + 1) / 2;
            if (A[i] == 1) {
                countOne += 1;
            }
        }
 
        // If all numbers in index 1 to n-2 = 1
        // then answer is not possible
        if (countOne == n - 2)
            return -1;
 
        // return steps
        return steps;
    }
 
    // Driver Code
    public static void Main()
    {
        int[] arr = { 3, 2, 1, 3, 5, 4 };
        int N = arr.Length;
 
        Console.Write(stepsToRearrange(arr, N));
    }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
// Javascript program for the above approach
 
// Function to shift the array
function stepsToRearrange(A, n)
{
    // if A has 3 elements and
    // 2nd element is odd then
    // answer is not possible
    if (n == 3 && (A[1] % 2 == 1))
        return -1;
 
    let steps = 0, countOne = 0;
 
    // Select even numbers and subtract 2
    // Now for the odd number
    // we add one and make them even.
    // so total steps = (a[i]+1)/2
    for (let i = 1; i < n - 1; i++) {
        steps += Math.floor((A[i] + 1) / 2);
        countOne += (A[i] == 1);
    }
 
    // If all numbers in index 1 to n-2 = 1
    // then answer is not possible
    if (countOne == n - 2)
        return -1;
 
    // return steps
    return steps;
}
 
// Driver Code
let arr = [ 3, 2, 1, 3, 5, 4 ];
let N = arr.length;
 
document.write(stepsToRearrange(arr, N));
 
// This code is contributed by Samim Hossain Mondal.
</script>
Producción

7

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

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