Minimice las operaciones para hacer que todos los elementos sean iguales reemplazando la mitad izquierda de Subarray con la mitad derecha

Dada una array arr[] de longitud N , la tarea es encontrar las operaciones mínimas para hacer que todos los elementos de la array sean iguales en cada operación:

  • Elija cualquier valor K cualquier subarreglo de longitud par 2*K
  • Reemplace la mitad izquierda del subarreglo por la mitad derecha del subarreglo.

Ejemplos:

Entrada: arr[] = {4, 4, 4, 2, 4}
Salida: 1
Explicación: En la primera operación, elija el índice i = 3 y K = 1. 
Entonces se elige un subarreglo de 2K de longitud de índices [3, 4]. 
Reemplace la primera mitad por la segunda mitad. Entonces se convierte en {4, 4, 4, 4, 4}

Entrada: arr[] = {4, 2, 1, 3}
Salida: 2
Explicación: En la primera operación, elija el índice i = 2, K = 1. 
La array se convierte en {4, 2, 3, 3}. 
En la segunda operación, elija el índice 0 y K = 2. 
Entonces, el subarreglo de longitud 4 y los dos primeros se reemplazan por los dos últimos. 
Entonces la array se convierte en {3, 3, 3, 3}. Entonces las operaciones son 2.

 

Planteamiento: Este problema se puede resolver con base en la siguiente observación:

Observaciones:

El último elemento nunca se puede cambiar con algún otro elemento ya que no hay elementos a la derecha por lo que todos los elementos anteriores deben ser iguales al último elemento.
Para minimizar las operaciones, mantenga tantos elementos iguales en la mitad derecha del subarreglo como sea posible.

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

  • Inicialice una variable res = 0 para almacenar las operaciones requeridas
  • Recorra desde el final de la array i = N – 2 a 0 :
    • Comprobar si arr[i] es igual al último elemento
    • Si es igual no se requiere operación
    • De lo contrario, es necesario realizar una operación eligiendo algunos K y una array de longitud 2 * K y reemplazar la primera mitad con la segunda mitad.
      • Considere arr[i] como el último elemento de la mitad izquierda y ( i+1 a N-1 ) como la mitad derecha y reemplace todos los elementos de la mitad izquierda con los elementos de la mitad derecha.
      • Así que incremente la resolución y muévase al índice i = (i – (N – 1 – i)) para tener operaciones mínimas reemplazando la mitad entera por la segunda mitad.
  • Devuelve la res como la respuesta requerida.

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 count minimum operations
int min_ops(int arr[], int n)
{
    int res = 0;
    int i = n - 1;
    while (i > 0) {
 
        // Check if arr[i]== arr[n-1]
        // If they are equal do i--
        if (arr[i] == arr[n - 1]) {
            i--;
        }
        else {
 
            // Try to do an operation
 
            // It is always optimal to
            // to move to the index of
            // length n-1-i before i
            // since it is easy to replace
            // first half with second half
            res++;
 
            // Move i to half of the
            // elements after that
            i -= (n - i - 1);
        }
    }
    return res;
}
 
// Driver code
int main()
{
    int arr[] = { 4, 2, 1, 3 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function call
    cout << min_ops(arr, N);
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
 
class GFG {
 
  // Function to count minimum operations
  static int min_ops(int arr[], int n)
  {
    int res = 0;
    int i = n - 1;
    while (i > 0) {
 
      // Check if arr[i]== arr[n-1]
      // If they are equal do i--
      if (arr[i] == arr[n - 1]) {
        i--;
      }
      else {
 
        // Try to do an operation
 
        // It is always optimal to
        // to move to the index of
        // length n-1-i before i
        // since it is easy to replace
        // first half with second half
        res++;
 
        // Move i to half of the
        // elements after that
        i -= (n - i - 1);
      }
    }
    return res;
  }
 
  // Driver code
  public static void main (String[] args) {
    int arr[] = { 4, 2, 1, 3 };
    int N = arr.length;
 
    // Function call
    System.out.print(min_ops(arr, N));
  }
}
 
// This code is contributed by hrithikgarg03188.

Python3

# Python program for the above approach
 
# Function to count minimum operations
def min_ops(arr, n):
 
    res = 0
    i = n - 1
    while (i > 0):
 
        # Check if arr[i]== arr[n-1]
        # If they are equal do i--
        if (arr[i] == arr[n - 1]):
            i = i-1
 
        else:
 
            # Try to do an operation
 
            # It is always optimal to
            # to move to the index of
            # length n-1-i before i
            # since it is easy to replace
            # first half with second half
            res = res + 1
 
            # Move i to half of the
            # elements after that
            i = i - (n - i - 1)
 
    return res
 
# Driver code
 
arr = [4, 2, 1, 3]
N = len(arr)
 
# Function call
print(min_ops(arr, N))
 
# This code is contributed by Taranpreet

C#

// C# program for the above approach
using System;
 
class GFG {
 
  // Function to count minimum operations
  static int min_ops(int[] arr, int n)
  {
    int res = 0;
    int i = n - 1;
    while (i > 0) {
 
      // Check if arr[i]== arr[n-1]
      // If they are equal do i--
      if (arr[i] == arr[n - 1]) {
        i--;
      }
      else {
 
        // Try to do an operation
 
        // It is always optimal to
        // to move to the index of
        // length n-1-i before i
        // since it is easy to replace
        // first half with second half
        res++;
 
        // Move i to half of the
        // elements after that
        i -= (n - i - 1);
      }
    }
    return res;
  }
 
  // Driver code
  public static void Main()
  {
    int[] arr = { 4, 2, 1, 3 };
    int N = arr.Length;
 
    // Function call
    Console.Write(min_ops(arr, N));
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
    // JavaScript program for the above approach
 
 
    // Function to count minimum operations
    const min_ops = (arr, n) => {
        let res = 0;
        let i = n - 1;
        while (i > 0) {
 
            // Check if arr[i]== arr[n-1]
            // If they are equal do i--
            if (arr[i] == arr[n - 1]) {
                i--;
            }
            else {
 
                // Try to do an operation
 
                // It is always optimal to
                // to move to the index of
                // length n-1-i before i
                // since it is easy to replace
                // first half with second half
                res++;
 
                // Move i to half of the
                // elements after that
                i -= (n - i - 1);
            }
        }
        return res;
    }
 
    // Driver code
 
    let arr = [4, 2, 1, 3];
    let N = arr.length;
 
    // Function call
    document.write(min_ops(arr, N));
 
// This code is contributed by rakeshsahni
 
</script>
Producción

2

Complejidad de tiempo: O(N) 
Complejidad de espacio: O(1)

Publicación traducida automáticamente

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