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
0come 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
lerche rappresentano un intervallo contiguo nell'array posizione ordinata che abbiamo già visitato - Un intero
locche ci dice se siamo sull'estremità sinistra o destra dell'intervallo - Un intero
timeche 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.