Ho una lista di coppie di numeri interi. Il valore di questa lista è la somma dei valori massimi di ciascuna coppia.
Per
(0, 5) (20, 5) (6, 8)
il valore sarebbe
5 + 20 + 8 = 33
Dato un elenco come questo, ho bisogno di massimizzare il suo valore. L'unica operazione che posso fare è scambiare un elemento di una coppia con un altro elemento di una coppia diversa.
Modifica : giusto per chiarire, ho bisogno di fare questa operazione tutte le volte che è necessario per ottenere il valore massimo, non solo una volta.
Per l'esempio sopra posso farlo
(6, 8) <> (0, 5)
L'elenco diventerebbe
(0, 6) (20, 5) (5, 8) => value = 6 + 20 + 8 = 34
Quindi per aumentare il valore avrei bisogno di trovare 2 coppie (a,b) (c,d)
con min(a,b) > max(c,d)
e poi scambiare min(a,b)
con max(c,d)
, giusto? Se non esistono coppie di questo tipo, non possiamo aumentare il valore della lista.
Soluzione:
Ho bisogno di mantenere le coppie ordinate in ordine decrescente dal valore minimo e in ordine crescente dal valore massimo perché ho bisogno di confrontare la coppia con il minimo maggiore con quella con il minimo più piccolo.
Ho pensato di utilizzare due heap per questo, un minheap che ordini in base ai massimi e un maxheap che ordini in base ai minimi. In questo modo, ogni volta che ho bisogno di confrontare posso semplicemente confrontare le radici dei due heap.
Il problema è che ho anche bisogno di aggiornare questi valori, scambiando il valore minimo di 1 coppia con il valore massimo di un'altra coppia e poi riordinando gli heap, quindi dovrei tenere anche informazioni aggiuntive per ogni nodo di heap per il posizione nell'altro heap. Qualcosa come Dual heap nella coda di priorità Double-ended .
È questo il modo migliore per affrontare questo problema, o ci sono strutture dati migliori che posso usare?