Minimice las operaciones requeridas para hacer que cada elemento de Array sea igual a su valor de índice

Dada una array arr[] que consta de N enteros, la tarea es modificar la array de tal manera que arr[index] = index utilizando el número mínimo de operaciones del siguiente tipo: 

  1. Elija cualquier índice i y cualquier número entero X , y agregue X a todos los elementos en el rango [0, i] .
  2. Elija cualquier índice i y cualquier entero X , y cambie arr[j] a arr[j] % X donde 0 ≤ j ≤ i .

Para cada operación realizada, imprima lo siguiente: 

  • Para la 1ª operación: imprima 1 i X
  • Para la 2ª operación: imprima 2 i X

Nota: Se pueden aplicar un máximo de N + 1 operaciones.

Ejemplos: 

Entrada: arr[] = {7, 6, 3}, N = 3 
Salida: 
1 2 5 
1 1 2 
1 0 1 
2 2 3 
Explicación: 
1ra operación: Agregar 5 a todos los elementos hasta que el índice 2 modifica la array a {12 , 11, 8}. 
2da operación: Agregar 2 a todos los elementos hasta que el índice 1 modifica la array a {14, 13, 8}. 
3ra operación: Agregar 1 a todos los elementos hasta que el índice 0 modifica la array a {15, 13, 8}. 
Cuarta operación: agregar 3 a todos los elementos hasta que el índice 2 modifica la array a {0, 1, 2}. 
Entonces, después de 4 operaciones, se obtiene la array requerida.
Entrada: arr[] = {3, 4, 5, 6}, N = 4 
Salida: 
1 3 5 
1 2 4 
1 1 4 
1 0 4 
2 3 4 

Enfoque: este problema se puede resolver utilizando el enfoque codicioso . A continuación se muestran los pasos: 

  1. Aplique N operaciones de tipo 1 donde la i -ésima operación es sumar X = ( N + i – (arr[i] % N) ) hasta el índice i recorriendo la array en el orden inverso. Para cada i -ésima operación, imprima “1 i X” .
  2. Después de las N operaciones anteriores, la array tendrá la forma arr[i] % N = i for 0 ≤ i < N .
  3. Se debe realizar una operación más, que consiste en realizar el módulo de cada elemento del arreglo con N , es decir, la operación «2 (N-1) N» .
  4. Después de realizar las operaciones anteriores, para cada índice i , arr[i] = i .

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

C++

// CPP program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function which makes the given
// array increasing using given
// operations
void makeIncreasing(int arr[], int N)
{
    // The ith operation will be
    // 1 i N + i - arr[i] % N
    for (int x = N - 1; x >= 0; x--)
    {
        int val = arr[x];
 
        // Find the value to be added
        // in each operation
        int add = N - val % N + x;
 
        // Print the operation
        cout << "1 " << x << " " << add << endl;
 
        // Performing the operation
        for (int y = x; y >= 0; y--) {
            arr[y] += add;
        }
    }
 
    // Last modulo with N operation
    int mod = N;
    cout << "2 " << N - 1 << " " << mod << endl;
    for (int x = N - 1; x >= 0; x--) {
        arr[x] %= mod;
    }
}
 
// Driver Code
int main()
{
    // Given array arr[]
    int arr[] = { 7, 6, 3 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    makeIncreasing(arr, N);
}

Java

// Java Program for the above approach
import java.util.*;
 
class GFG
{
    // Function which makes the given
    // array increasing using given
    // operations
    static void makeIncreasing(int arr[], int N)
    {
 
        // The ith operation will be
        // 1 i N + i - arr[i] % N
        for (int x = N - 1; x >= 0; x--)
        {
            int val = arr[x];
 
            // Find the value to be added
            // in each operation
            int add = N - val % N + x;
 
            // Print the operation
            System.out.println("1"
                               + " " + x + " " + add);
 
            // Performing the operation
            for (int y = x; y >= 0; y--)
            {
                arr[y] += add;
            }
        }
 
        // Last modulo with N operation
        int mod = N;
 
        System.out.println("2"
                           + " " + (N - 1) + " " + mod);
 
        for (int x = N - 1; x >= 0; x--)
        {
            arr[x] %= mod;
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        // Given array arr[]
        int arr[] = { 7, 6, 3 };
        int N = arr.length;
        // Function Call
        makeIncreasing(arr, N);
    }
}

Python3

# python Program for the above problem
# Function which makes the given
# array increasing using given
# operations
def makeIncreasing(arr, N):
     
    # The ith operation will be
    # 1 i N + i - arr[i] % N
    for x in range( N - 1 ,  -1, -1):
        val = arr[x]
         
        # Find the value to be added
        # in each operation
        add = N - val % N + x
         
        # Print the operation
        print("1" + " " + str(x) + " " + str(add))
         
        # Performing the operation
        for y in range(x, -1, -1):
            arr[y] += add
     
    # Last modulo with N operation
    mod = N;
    print("2" + " " + str(N - 1) + " " + str(mod))
    for i in range( N - 1, -1, -1):
        arr[i] = arr[i] % mod
 
# Driver code
 
# Given array arr
arr = [ 7, 6, 3 ]
 
N = len(arr)
 
# Function Call
makeIncreasing(arr, N)

C#

// C# Program for the above approach
using System;
 
class GFG
{
    // Function which makes the given
    // array increasing using given
    // operations
    static void makeIncreasing(int[] arr, int N)
    {
 
        // The ith operation will be
        // 1 i N + i - arr[i] % N
        for (int x = N - 1; x >= 0; x--)
        {
            int val = arr[x];
 
            // Find the value to be added
            // in each operation
            int add = N - val % N + x;
 
            // Print the operation
            Console.WriteLine("1"
                              + " " + x + " " + add);
 
            // Performing the operation
            for (int y = x; y >= 0; y--)
            {
                arr[y] += add;
            }
        }
 
        // Last modulo with N operation
        int mod = N;
 
        Console.WriteLine("2"
                          + " " + (N - 1) + " " + mod);
 
        for (int x = N - 1; x >= 0; x--) {
            arr[x] %= mod;
        }
    }
 
    // Driver code
    public static void Main()
    {
        // Given array arr[]
        int[] arr = new int[] { 7, 6, 3 };
 
        int N = arr.Length;
 
        // Function Call
        makeIncreasing(arr, N);
    }
}

Javascript

<script>
 
      // JavaScript Program for the above approach
       
      // Function which makes the given
      // array increasing using given
      // operations
      function makeIncreasing(arr, N)
      {
        // The ith operation will be
        // 1 i N + i - arr[i] % N
        for (var x = N - 1; x >= 0; x--) {
          var val = arr[x];
 
          // Find the value to be added
          // in each operation
          var add = N - (val % N) + x;
 
          // Print the operation
          document.write("1" + " " + x + " "
          + add + "<br>");
 
          // Performing the operation
          for (var y = x; y >= 0; y--) {
            arr[y] += add;
          }
        }
 
        // Last modulo with N operation
        var mod = N;
 
        document.write("2" + " " + (N - 1) + " "
        + mod + "<br>");
 
        for (var x = N - 1; x >= 0; x--) {
          arr[x] %= mod;
        }
      }
 
      // Driver code
       
      // Given array arr[]
      var arr = [7, 6, 3];
      var N = arr.length;
 
      // Function Call
      makeIncreasing(arr, N);
       
</script>
Producción

1 2 5
1 1 2
1 0 1
2 2 3

Complejidad de Tiempo: O(N 2 )  
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

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