Entrevista Street puzzle: ¿Pregunta de hormigas en la sección de matemáticas?

Esto parecía un problema muy interesante, así que seguí adelante y lo probé:

Resumen del problema (para personas que no han analizado el problema):

  • Hay N <= 100 hormigas en pista circular
  • La pista tiene 1000 metros de largo
  • Se da la posición inicial de las hormigas (son distintas)
  • La hormiga viaja 0.1 metros por segundo
  • Algunas hormigas caminan en sentido horario, otras hormigas caminan en sentido antihorario alrededor de la pista
  • Cuando dos hormigas se encuentran en un punto, cambian de dirección (el costo de cambiar de dirección es de 0 segundos)
  • Encuentre el número máximo de colisiones (hormigas que se encuentran en el mismo punto), si se le permite elegir la dirección inicial de las hormigas
  • Las hormigas corren durante 10 ^ 9 + 6 segundos alrededor de la pista.

Aquí hay algunas observaciones que lo ayudarán a resolver el problema:

1) Puede ignorar los cambios de dirección debido a que las hormigas chocan:

¿Por qué? Supongamos que dos hormigas estaban a punto de chocar:

Antes de la colisión:
(ant1)> <(ant2)

Después de que dos hormigas chocan y cambian de dirección, se vería algo así:

Sin embargo, tenga en cuenta que no distinguimos entre hormigas diferentes, por lo que podría tratarlo como si dos hormigas se “pasaran”:

Las dos situaciones anteriores son equivalentes, ya que todas las hormigas son idénticas (hubiera sido un problema mucho más difícil si este no fuera el caso). Esto significa que puedes tratar la dirección de todas las hormigas para que se arreglen.

2) En el caso óptimo, N / 2 de la hormiga viaja en la dirección opuesta:

Esto no es difícil de ver, una vez que ignoras el cambio de dirección. Si dos hormigas viajan en la misma dirección, nunca chocarán, por lo que sería óptimo hacer que la mitad de ellas viajen en la dirección opuesta.

3) La dirección inicial de las hormigas no importa (a excepción de un caso muy especial discutido en 4):

¿Por qué? Considere el caso cuando la hormiga está en la posición 500 y 502. ¿Cuántas veces chocarán? Si viajaron uno frente al otro (distancia más corta), se encontrarán después de 10 segundos (1 metro cada uno) y colisionarán cada 5000 segundos, encontrándose por última vez a 999995010 segundos. Si viajaron uno frente al otro (mayor distancia), se encontrarán después de 4990 segundos, por última vez en 999999990 segundos. (999999990-999995010) = 4980 <5000, por lo que se encontraron con la misma cantidad de tiempo independientemente de la dirección en que viajaron.

4) Que importan 6 segundos adicionales:

¿Qué pueden hacer esos 6 segundos adicionales por ti? En 6 segundos, la hormiga puede viajar 0.6 metros, lo que significa que si dos hormigas están dentro de la distancia 1, si caminan una hacia la otra chocarán. Esto significa que si hay dos hormigas con una distancia inicial entre ellas de 1 metro, querrás hacer que se enfrenten para que puedan chocar una vez más usando los primeros 5 segundos.

Eso debería ser suficiente para resolver el problema. Como el tamaño del problema es pequeño, no hay necesidad de optimizarlo.

More Interesting

¿Cuál es el elemento más pequeño / más grande en el código Java?

¿Cómo funciona LSH, 'hashing local sensible', para calcular el valor de hash?

¿Dar un nombre largo a una variable es una pérdida de memoria? ¿Int qwertyuiop_asdfghjkl_zxcvbnm; int i; tener el mismo efecto en el tiempo de compilación y ejecución?

¿Qué algoritmos usa Quora para restringir que el contenido de ciertos escritores se transmita tanto como otros?

Cómo escribir un algoritmo de aprendizaje automático que prediga la edad de alguien

¿Cómo puedo diseñar una función hash que elija aleatoriamente 16 bits de un número de 32 bits?

¿Qué tan difícil es el algoritmo de verificación de traducción de Duolingo? ¿Existen otras herramientas de código abierto similares por ahí?

Cómo resolver esta recurrencia T (n) = T (sqrt (n)) + log_2 n

¿Cuáles son las ventajas de los algoritmos de aprendizaje de refuerzo como LinUCB sobre otros algoritmos de predicción de CTR en línea como la regresión logística en línea?

¿Qué son los algoritmos de compresión de datos?

Cómo escribir un programa en C para buscar los elementos usando el orden de fusión

Cómo encontrar los diferentes números de subconjuntos contiguos de una matriz usando Java

Cómo escribir un algoritmo de la pila de programas usando una matriz en C

Cómo hacer que el software de mi sitio web lea un correo electrónico, capture la ID en el asunto y actúe en función de esa ID

Dada una lista de enlaces con punteros derechos, cada elemento de la lista tiene un enlace descendente que contiene otra lista de enlaces con punteros descendentes, de modo que cada lista derecha y abajo están ordenadas. ¿Cuál es la forma más rápida de aplanar la lista de enlaces de forma ordenada?