Saltos mínimos para atravesar todos los enteros en el rango [1, N] de modo que el entero pueda saltar i pasos

Dado un número entero N, la tarea es encontrar los pasos mínimos para visitar todos los números enteros en el rango [1, N] seleccionando cualquier número entero y saltando i pasos en cada i -ésimo salto.

Nota: es posible volver a visitar un número entero más de una vez. 

Ejemplos:

Entrada: N = 6
Salida: 3
Explicación: 
Una de las siguientes formas es: 
Primero comience en el primer número y visite los enteros {1, 2, 4}.
Ahora comience en el segundo número y visite los enteros como {2, 3, 5}
Ahora comience en el último número y visítelo.
Por lo tanto, en un total de 3 pasos se pueden visitar todos los números en el rango [1, 6]. Y también es el número mínimo de pasos necesarios.

Entrada: N = 4
Salida: 2

Enfoque ingenuo: el problema dado se puede resolver en función de las siguientes observaciones: 

  • En cada paso las dimensiones de los saltos aumentan, por eso algunos números se quedan sin visitar en un paso.
  • Partiendo del primer número y realizando los saltos se puede observar que el tamaño máximo del salto es el número total de pasos necesarios para visitar cada número. Como en un movimiento, uno no puede visitar cada número entre dos números no visitados.

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

  • Inicialice dos variables, digamos count = 1 y res = 0.
  • Recorra el rango [1, N] e incremente i por conteo y actualice res como res =max(res, conteo) e incremente conteo en 1 .
  • Después de completar los pasos anteriores, imprima el res.

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

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Utility function to find minimum steps
int minSteps(int N)
{
    // Initialize count and result
    int count = 1, res = 0;
 
    // Traverse over the range [1, N]
    for (int i = 1; i <= N; i += count) {
        // Update res
        res = max(res, count);
        // Increment count
        count++;
    }
 
    // Return res
    return res;
}
 
// Driver Code
int main()
{
    // Input
    int N = 6;
 
    // Function call
    cout << minSteps(N) << "\n";
}

Java

// Java program for the above approach
import java.io.*;
 
class GFG
{
 
  // Utility function to find minimum steps
  static int minSteps(int N)
  {
 
    // Initialize count and result
    int count = 1, res = 0;
 
    // Traverse over the range [1, N]
    for (int i = 1; i <= N; i += count)
    {
 
      // Update res
      res = Math.max(res, count);
 
      // Increment count
      count++;
    }
 
    // Return res
    return res;
  }
 
  // Driver Code
  public static void main (String[] args)
  {
 
    // Input
    int N = 6;
 
    // Function call
 
    System.out.println(minSteps(N) );
  }
}
 
// This code is contributed by Potta Lokesh

Python3

# Python 3 implementation of the above approach
 
# Utility function to find minimum steps
def minSteps(N):
   
    # Initialize count and result
    count = 1
    res = 0
 
    # Traverse over the range [1, N]
    for i in range(1, N + 1, count):
       
        # Update res
        res = max(res, count)
         
        # Increment count
        count += 1
 
    # Return res
    return res
 
# Driver Code
if __name__ == '__main__':
   
    # Input
    N = 6
 
    # Function call
    print(minSteps(N))
     
    # This code is contributed by SURENDRA_GANGWAR.

C#

// C# program for the above approach
using System;
 
class GFG{
 
  // Utility function to find minimum steps
  static int minSteps(int N)
  {
 
    // Initialize count and result
    int count = 1, res = 0;
 
    // Traverse over the range [1, N]
    for (int i = 1; i <= N; i += count)
    {
 
      // Update res
      res = Math.Max(res, count);
 
      // Increment count
      count++;
    }
 
    // Return res
    return res;
  }
 
 
// Driver Code
public static void Main()
{
    // Input
    int N = 6;
 
    // Function call
 
    Console.Write(minSteps(N) );
}
}

Javascript

<script>
 
// JavaScript implementation of the above approach
 
// Utility function to find minimum steps
function minSteps(N) {
  // Initialize count and result
  let count = 1,
    res = 0;
 
  // Traverse over the range [1, N]
  for (let i = 1; i <= N; i += count) {
    // Update res
    res = Math.max(res, count);
    // Increment count
    count++;
  }
 
  // Return res
  return res;
}
 
// Driver Code
 
// Input
let N = 6;
 
// Function call
document.write(minSteps(N));
 
</script>
Producción

3

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

Enfoque eficiente:  los pasos anteriores se pueden optimizar en función de las siguientes observaciones:

  • Supongamos una array arr[] como arr[] ={1, 1, 2, 2, 2, 3, 3, 3, ….]. Ahora la idea es encontrar el número K que es el tamaño máximo de salto dado en un paso.
  • En la array anterior, ya que 1 ocurre dos veces, 2 ocurre tres veces, 3 ocurre cuatro veces y así sucesivamente. ( K – 1) ocurriría K veces.
  • Ahora, supongamos que K ocurre c veces, entonces el recuento total de ocurrencias debe ser igual a N.
    • 2 + 3 + 4 +….+ K + c = N
    • c = N – 2 – 3 – 4 -….- K …..(i)
  • Entonces uno necesita encontrar la mayor ecuación que satisfaga K (i) también c≥1 , entonces
    • K 2 + K – 2 × norte ≤ 0.
  • Por lo tanto , K = (-1 + √(1 + 8 ×N)) / 2

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

  • Imprime el valor (-1 + √(1 + 8 *N)) / 2 .

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

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Utility function to find minimum steps
int minSteps(int N)
{
    int res = (sqrt(1 + 8 * N) - 1) / 2;
    return res;
}
 
// Driver code
int main()
{
    // Input integer
    int N = 6;
 
    // Function call
    cout << minSteps(N) << "\n";
}

Java

// Java implementation of the above approach
import java.io.*;
import java.lang.Math;
 
class GFG{
     
// Utility function to find minimum steps
static int minSteps(int N)
{
    int res = ((int)Math.sqrt(1 + 8 * N) - 1) / 2;
    return res;
}
 
// Driver code
public static void main (String[] args)
{
     
    // Input integer
    int N = 6;
     
    // Function call
    System.out.println(minSteps(N) + "\n");
}
}
 
// This code is contributed by shivanisinghss2110

Python3

# Python 3 implementation of the above approach
 
from math import sqrt
# Utility function to find minimum steps
def minSteps(N):
    res = int((sqrt(1 + 8 * N) - 1) // 2)
    return res
 
# Driver code
if __name__ == '__main__':
    # Input integer
    N = 6
 
    # Function call
    print(minSteps(N))

C#

// Java implementation of the above approach
using System;
class GFG
{
     
// Utility function to find minimum steps
static int minSteps(int N)
{
    int res = ((int)Math.Sqrt(1 + 8 * N) - 1) / 2;
    return res;
}
 
// Driver code
public static void Main (String[] args)
{
     
    // Input integer
    int N = 6;
     
    // Function call
    Console.Write(minSteps(N) + "\n");
}
}
 
// This code is contributed by shivanisinghss2110

Javascript

<script>
// javascript implementation of the above approach
 
// Utility function to find minimum steps
function minSteps(N)
{
    var res = parseInt((Math.sqrt(1 + 8 * N) - 1) / 2);
    return res;
}
 
// Driver code
     
// Input integer
var N = 6;
 
// Function call
document.write(minSteps(N));
 
// This code contributed by shikhasingrajput
</script>
Producción

3

Complejidad Temporal: O (1)
Espacio Auxiliar: O (1)

Publicación traducida automáticamente

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