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 = 1000contenitori 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 = 0e può spostare l' 1unità 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:
4Contenitori situati a [-12, -2, 3, 7].
L'ordine migliore per raccogliere questi contenitori è [-2, 3, 7, -12], per un minimo di emissione di 50unità. Spiegazione: la persona va -2in 2 secondi e durante quel tempo 2 unitsdi emissione di radiazioni. Quindi va a 3(distanza:) in 5modo che il barile abbia rilasciato 2 + 5 = 7unità di radiazione. Ci vogliono 4più secondi per arrivare a x = 7dove quel barile ha emesso 2 + 5 + 4 = 11unità. Ci vogliono 19pochi secondi per arrivare a x = -12dove quel barile ha emesso 2 + 5 + 4 + 19 = 30unità. 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
0come posizione di base (questo sarà lo stato iniziale) - Quindi, ordiniamo le posizioni dal meno al più grande.
- Facciamo quindi un BFS / PFS, in cui è
statecomposto- Due interi
lerche rappresentano un intervallo contiguo nella matrice posizione ordinato che abbiamo visitato già - Un numero intero
locche ci dice se siamo sull'estremità sinistra o destra dell'intervallo - Un numero intero
timeche 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 costal 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é timeinfluisce 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.