¿Cómo se puede resolver el problema ‘Unos y ceros’ en SPOJ usando BFS?

Representemos nuestros números como cadenas aquí. Ahora, considere que hay [math] N [/ math] estados, donde [math] i [/ math] th state almacena la cadena más pequeña que cuando toma el módulo con [math] N [/ math] da [math] i [/ mates]. Nuestro objetivo es alcanzar el estado 0. Ahora, comenzamos desde el estado “[matemática] 1 [/ matemática]” y en cada paso tenemos dos opciones, ya sea para agregar “[matemática] 0 [/ matemática]” o “[matemática] ] 1 [/ math] “al estado actual. Intentamos explorar ambas opciones, pero tenga en cuenta que si ya he visitado un estado, ¿por qué lo volvería a visitar? Ya almacena la cadena más pequeña que alcanza ese estado y si la vuelvo a visitar con una nueva cadena seguramente tendrá más caracteres que la cadena ya almacenada.

Motivo por el que no tenemos que volver a visitar el mismo estado: dejemos que xey sean cadenas, que tienen el mismo estado. Deje que [math] x [/ math] sea la más pequeña y [math] z [/ math] sea otra cadena que cuando se agrega a [math] y [/ math] nos da un número divisible por [math] n [/ math ] Si es así, también podemos agregar esta cadena a [math] x [/ math], que es más pequeña que [math] y [/ math], y aún así obtener un número divisible por n. Por lo tanto, podemos ignorar [math] y [/ math] de manera segura, ya que el resultado más pequeño se obtendrá solo a través de [math] x [/ math].

Entonces, esto es básicamente un BFS en los estados. Visitaremos un estado casi una vez, por lo tanto, la complejidad general es [math] \ mathcal {O} (N) [/ math]. Lo interesante es que no necesito almacenar la cadena completa para cada estado, solo puedo almacenar el módulo de valor [math] N [/ math] y puedo ver fácilmente a qué dos estados nuevos voy. Puedo reconstruir la cadena cuando llego a mi estado final si almaceno para cada estado: desde donde llegué a ese estado y a través del cual agrego ([matemáticas] 0 [/ matemáticas] o [matemáticas] 1 [/ matemáticas]).

Todo el problema se trata de encontrar un número que consta de unos y ceros (al menos uno 1).
Entrada: un número
Enfoque ingenuo:
1.Compruebe que nuestra entrada consiste solo en unos y ceros o no
2. Si no lo multiplica con i (i = 2 hasta el infinito) y verifique nuevamente.
Pero esto llevará mucho tiempo.
Veamos el enfoque hacia atrás.
¿Qué estamos haciendo en el enfoque ingenuo?
1. Multiplicamos un número positivo con entrada
2. Y luego verifique que consta de solo unos y ceros
Hagamos lo contrario de estos pasos
1.Toma números que son solo unos y ceros
2. Y luego verifique que este número sea múltiplo de la entrada dada.
Esto funcionará porque tenemos menos números que son solo unos y ceros.
¿Cómo tomar números que son solo unos y ceros?
¿Cuál es el caso base de nuestro requisito de número = 1?
Desde 1, ¿cómo ir a otros números que son solo unos y ceros?
De cada número n (que consta de unos y ceros) podemos pasar a otros números (que consta de unos y ceros) mediante esta fórmula:
n * 10, n * 10 + 1
Por ejemplo: 1 -> 10,11 10-> 100,101 11-> 110,111 Este proceso continúa hasta que encontremos un número que sea múltiplo del número dado.
¿Cómo hacer esto por encima de todo el proceso?
Aquí para este propósito usamos BFS (Breadth First Search).
Algunas optimizaciones:
1. No necesitamos comenzar desde 1.
2. No necesitamos almacenar el número entero (confuso … piénselo)

More Interesting

¿Hay algún libro sobre estructuras de datos y algoritmos que tenga estructuras de datos diferentes, su complejidad, sus usos y todas las cosas interesantes sobre ellos?

¿Por qué las funciones recursivas son tan difíciles de entender?

Como un codificador relativamente nuevo, mi código es un poco más largo que el de un programador experimentado en resolución de problemas. ¿Será esto un elemento disuasorio para los empleadores?

Cómo usar un video como entrada en un algoritmo de aprendizaje automático

¿Por qué sigo fallando la introducción a los algoritmos en la escuela de posgrado?

¿Dónde es útil el conocimiento de las estructuras de datos en Swift?

¿Por qué muchos elementos utilizados en la función objetivo de un algoritmo de aprendizaje asumen todas las características centradas en cero y tienen una varianza en el mismo orden?

¿Cuál es el algoritmo de esta pregunta de Hacker-Rank?

¿Qué tipo de datos debo usar en C para almacenar datos como a1b2c3? ¿Podría usar una matriz de caracteres para almacenar esto como una cadena?

¿Existe un algoritmo para salir de laberintos bidimensionales?

¿Cuál es la diferencia entre los siguientes dos fragmentos de código?

¿Puede la búsqueda de profundización iterativa encontrar una solución más rápida que A * en algunos casos?

¿Cómo funcionan los algoritmos comerciales?

¿Qué son los proyectos de código abierto? Soy muy bueno en C ++, estructuras de datos y algoritmos. ¿Puedo contribuir a algunos proyectos de código abierto? Si es así, ¿cómo? ¿Tendré que aprender algún idioma nuevo?

¿Qué significa importar en Python? ¿Puedo hacer mi propio algoritmo sin usar importar?