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 = 1000
contenedores 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 = 0
y puede moverla 1
cada 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:
4
Contenedores 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 50
unidades. Explicación: la persona acude -2
en 2 segundos y durante ese tiempo 2 units
se emite radiación. Luego va a 3
(distancia:) 5
para que el cañón haya liberado 2 + 5 = 7
unidades de radiación. Tarda 4
más segundos en llegar a x = 7
donde ese barril ha emitido 2 + 5 + 4 = 11
unidades. Toma 19
segundos para llegar a x = -12
donde ese barril ha emitido 2 + 5 + 4 + 19 = 30
unidades. 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
0
como una posición de referencia (Este será el estado inicial) - Luego, clasificamos las posiciones de menor a mayor.
- Luego hacemos un BFS / PFS, donde
state
consiste en- Dos enteros
l
yr
que representan un rango contiguo en la matriz de posición ordenada que ya hemos visitado - Un entero
loc
que nos dice si estamos en el punto final izquierdo o derecho del rango - Un número entero
time
que 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 cost
en 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 cost
es baja no significa que sea la respuesta óptima para ese subproblema, ya que time
tambié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.