Ho bisogno di aiuto su questo problema ICPC ACM. La mia idea attuale è quella di modellarlo come un problema di percorso più breve, che è descritto nella dichiarazione del problema.
problema
Ci sono N = 1000
di contenitori di rifiuti nucleari situati lungo una linea numerica 1-D in posizioni distinte da -500,000 to 500,000
, eccetto x=0
. Una persona ha il compito di raccogliere tutti i cassonetti dei rifiuti. Ogni secondo che un contenitore di rifiuti non viene raccolto, emette 1 unità di radiazione. La persona inizia a x = 0
e può spostare 1
unità al secondo e raccogliere i rifiuti richiede un tempo trascurabile. Vogliamo trovare la quantità minima di radiazioni rilasciate durante la raccolta di tutti i contenitori.
Immissione di esempio:
4
Contenitori situati a [-12, -2, 3, 7]
.
L'ordine migliore per raccogliere questi contenitori è [-2, 3, 7, -12]
, per un'emissione minima di 50
unità. Spiegazione: la persona va a -2
in 2 secondi e durante quel tempo viene emessa la% di2 units
di radiazione. Quindi passa a 3
(distanza: 5
) in modo che il barile abbia liberato 2 + 5 = 7
di radiazioni. Prende 4
di secondi in più per arrivare a x = 7
dove quel barile ha emesso 2 + 5 + 4 = 11
unità. Prende 19
secondi per arrivare a x = -12
dove quel barile ha emesso 2 + 5 + 4 + 19 = 30
unità. 2 + 7 + 11 + 30 = 50
, che è la risposta.
Note
C'è una ovvia soluzione O(N!)
. Tuttavia, ho esplorato metodi avidi come il passaggio a quello più vicino o il passaggio al cluster più vicino, ma quelli non hanno funzionato.
Ho pensato a questo problema per un po 'di tempo e l'ho modellato come un problema di ricerca del grafico:
- Inseriamo
0
come posizione di base (Questo sarà lo stato iniziale) - Quindi, ordiniamo le posizioni dalla meno alla maggiore.
- Facciamo quindi un BFS / PFS, in cui è composta la
state
- Due interi
l
er
che rappresentano un intervallo contiguo nell'array posizione ordinata che abbiamo già visitato - Un intero
loc
che ci dice se siamo sull'estremità sinistra o destra dell'intervallo - Un intero
time
che ci dice il tempo trascorso - Un intero "costo" che ci indica il costo totale finora (basato sui nodi che abbiamo visitato)
- Due interi
- Da ogni stato possiamo spostarci su [l - 1, r] e [l, r + 1], modificando di conseguenza gli altri 3 numeri interi
- Lo stato finale è [0, N], controllando entrambe le posizioni finali.
Tuttavia, sembra che [L, R, loc]
non definisca univocamente uno stato e dobbiamo memorizzare L, R, loc, and time
, riducendo al minimo cost
a ciascuno di questi. Questo porta ad un algoritmo esponenziale, che è ancora troppo lento per qualsiasi bene.
Qualcuno può aiutarmi ad espandere la mia idea o spingerla nella giusta direzione?
Modifica: Forse questo può essere modellato come un problema di ottimizzazione della programmazione dinamica? Pensandoci, ha gli stessi problemi della soluzione di ricerca del grafico - solo perché l'attuale cost
è bassa non significa che sia la risposta ottimale per quel sottotesto, poiché anche time
influisce molto sulla risposta.
Greedy non funziona: ho un avido algoritmo di selezione che stima il costo del trasferimento in un determinato luogo (ad esempio, se ci muoviamo a destra, raddoppiamo le distanze verso i barilotti di sinistra e così via).
Potresti fare una ricerca prioritaria, con un euristico? L'euristica potrebbe combinare il costo del viaggio corrente con la quantità di tempo trascorso.