Ho bisogno di aiuto su questo problema ACPC ICPC. La mia idea attuale è quella di modellare questo come un problema di percorso più breve, che è descritto nella dichiarazione del problema.
Problema
Esistono N = 1000
contenitori per 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 in cui un contenitore per rifiuti non viene raccolto, emette 1 unità di radiazione. La persona inizia alle x = 0
e può spostare l' 1
unità ogni secondo, e la raccolta dei rifiuti richiede una quantità trascurabile di tempo. Vogliamo trovare la quantità minima di radiazione emessa durante la raccolta di tutti i contenitori.
Input di esempio:
4
Contenitori situati a [-12, -2, 3, 7]
.
L'ordine migliore per raccogliere questi contenitori è [-2, 3, 7, -12]
, per un minimo di emissione di 50
unità. Spiegazione: la persona va -2
in 2 secondi e durante quel tempo 2 units
di emissione di radiazioni. Quindi va a 3
(distanza:) in 5
modo che il barile abbia rilasciato 2 + 5 = 7
unità di radiazione. Ci vogliono 4
più secondi per arrivare a x = 7
dove quel barile ha emesso 2 + 5 + 4 = 11
unità. Ci vogliono 19
pochi 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.
Appunti
C'è una O(N!)
soluzione ovvia . Tuttavia, ho esplorato metodi avidi come passare al più vicino o passare al cluster più vicino ma quelli non hanno funzionato.
Ho pensato a questo problema per un bel po 'e l'ho modellato come un problema di ricerca grafica:
- Inseriamo
0
come posizione di base (questo sarà lo stato iniziale) - Quindi, ordiniamo le posizioni dal meno al più grande.
- Facciamo quindi un BFS / PFS, in cui è
state
composto- Due interi
l
er
che rappresentano un intervallo contiguo nella matrice posizione ordinato che abbiamo visitato già - Un numero intero
loc
che ci dice se siamo sull'estremità sinistra o destra dell'intervallo - Un numero intero
time
che ci dice il tempo trascorso - Un 'costo' intero che ci dice il costo totale finora (basato sui nodi che abbiamo visitato)
- Due interi
- Da ogni stato possiamo passare a [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 in modo univoco uno stato e dobbiamo archiviarlo L, R, loc, and time
, riducendo cost
al minimo in ciascuno di questi. Questo porta ad un algoritmo esponenziale, che è ancora troppo lento per qualsiasi bene.
Qualcuno può aiutarmi a espandere la mia idea o spingermi 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é la corrente cost
è bassa non significa che sia la risposta ottimale per quel sotto-problema, poiché time
influisce anche notevolmente sulla risposta.
Greedy non funziona: ho un algoritmo di selezione avido che stima il costo del trasferimento in un determinato luogo (ad es. Se ci spostiamo a destra, raddoppiamo le distanze ai barili di sinistra e simili).
Potresti fare una ricerca prioritaria, con un'euristica? L'euristico potrebbe combinare il costo del viaggio corrente con la quantità di tempo trascorso.