Necesito ayuda sobre este problema ACM ICPC. Mi idea actual es modelar esto como un problema de ruta más corta, que se describe en la declaración del problema.
Problema
Hay N = 1000contenedores de desechos nucleares ubicados a lo largo de una línea de números 1-D en posiciones distintas de -500,000 to 500,000, excepto x=0. Una persona tiene la tarea de recoger todos los contenedores de basura. Cada segundo que no se recoge un contenedor de residuos, emite 1 unidad de radiación. La persona comienza a la unidad x = 0y puede moverla 1cada segundo, y la recolección de los desechos lleva un tiempo insignificante. Queremos encontrar la cantidad mínima de radiación liberada mientras recolectamos todos los contenedores.
Entrada de muestra:
4Contenedores ubicados en [-12, -2, 3, 7].
El mejor orden para recolectar estos contenedores es [-2, 3, 7, -12], para un mínimo de emisión de 50unidades. Explicación: la persona acude -2en 2 segundos y durante ese tiempo 2 unitsse emite radiación. Luego va a 3(distancia:) 5para que el cañón haya liberado 2 + 5 = 7unidades de radiación. Tarda 4más segundos en llegar a x = 7donde ese barril ha emitido 2 + 5 + 4 = 11unidades. Toma 19segundos para llegar a x = -12donde ese barril ha emitido 2 + 5 + 4 + 19 = 30unidades. 2 + 7 + 11 + 30 = 50, cual es la respuesta.
Notas
Hay una O(N!)solución obvia . Sin embargo, he explorado métodos ambiciosos como pasar al más cercano o al clúster más cercano, pero no han funcionado.
He pensado en este problema durante bastante tiempo, y lo he modelado como un problema de búsqueda de gráficos:
- Lo insertamos
0como una posición de referencia (Este será el estado inicial) - Luego, clasificamos las posiciones de menor a mayor.
- Luego hacemos un BFS / PFS, donde
stateconsiste en- Dos enteros
lyrque representan un rango contiguo en la matriz de posición ordenada que ya hemos visitado - Un entero
locque nos dice si estamos en el punto final izquierdo o derecho del rango - Un número entero
timeque nos dice el tiempo transcurrido. - Un 'costo' entero que nos dice el costo total hasta ahora (según los nodos que hemos visitado)
- Dos enteros
- Desde cada estado podemos movernos a [l - 1, r] y [l, r + 1], ajustando los otros 3 enteros en consecuencia
- El estado final es [0, N], verificando ambas posiciones finales.
Sin embargo, parece que [L, R, loc]no define de forma exclusiva un estado, y tenemos que almacenarlo L, R, loc, and time, minimizando costen cada uno de estos. Esto lleva a un algoritmo exponencial, que todavía es demasiado lento para ser bueno.
¿Alguien puede ayudarme a ampliar mi idea o empujarla en la dirección correcta?
Editar: ¿ Quizás esto se pueda modelar como un problema de optimización de programación dinámica? Pensando en ello, tiene los mismos problemas que la solución de búsqueda de gráficos: solo porque la corriente costes baja no significa que sea la respuesta óptima para ese subproblema, ya que timetambién afecta la respuesta en gran medida.
Codicioso no funciona: tengo un algoritmo de selección codicioso que estima el costo de mudarse a un lugar determinado (por ejemplo, si nos movemos a la derecha, duplicamos las distancias a los barriles izquierdos y tal).
¿Podría hacer una búsqueda de prioridad primero, con una heurística? La heurística podría combinar el costo del viaje actual con la cantidad de tiempo transcurrido.