Quando impili i libri di solito vuoi mettere quelli più grandi in basso e quelli più piccoli in alto. Tuttavia, il mio DOC latente mi fa sentire molto a disagio se ho due libri in cui uno è più corto (in altezza) ma più largo dell'altro. Indipendentemente dall'ordine in cui li inserisco, il libro superiore si estenderà oltre il libro inferiore su un lato.
Ad esempio, supponiamo che un libro abbia dimensioni (10,15)
e un altro abbia dimensioni (11,14)
. Non importa in che modo li metto, ottengo una sporgenza. Ma se ho libri con dimensioni (4,3)
e (5,6)
, posso evitare uno strapiombo posizionando quest'ultimo sotto il primo.
Ai fini di questa sfida considereremo gli strapiombi solo in relazione al libro immediatamente sotto . Ad esempio, se ho una pila (5,5)
, (3,3)
, (4,4)
(non che nessuna persona sana di mente avrebbe fatto), i conteggi top libro come una sporgenza, anche se non si estende oltre il libro di fondo. Analogamente, la pila (3,3)
, (3,3)
, (4,4)
ha anche una sola sporgenza, nonostante il libro superiore si estende oltre quello inferiore.
La sfida
Dato un elenco di coppie intere per le dimensioni del libro, ordina quelle coppie / libri in modo tale che il numero di sporgenze sia minimo. Non devi ruotare i libri: voglio che tutte le spine siano rivolte nella stessa direzione. Se esistono più soluzioni con lo stesso numero di sporgenze, è possibile scegliere un tale ordine. L'algoritmo di ordinamento non deve essere stabile. L'implementazione potrebbe presumere che le dimensioni del libro siano inferiori a 2 16 ciascuna.
Complessità temporale: per renderlo un po 'più interessante, la complessità asintotica nel caso peggiore dell'algoritmo deve essere polinomiale nelle dimensioni dello stack. Quindi non puoi semplicemente testare ogni possibile permutazione. Includi una breve prova dell'ottimalità e della complessità dell'algoritmo e, facoltativamente, un grafico che mostra il ridimensionamento per input casuali di grandi dimensioni. Naturalmente, non è possibile utilizzare la dimensione massima dell'input come argomento per l'esecuzione del codice in O (1).
È possibile scrivere un programma o una funzione, accettare input tramite STDIN, ARGV o argomento della funzione in qualsiasi formato di elenco conveniente (non preelaborato) e stampare o restituire il risultato.
Questo è il golf del codice, quindi vince la risposta più breve (in byte).
Sono fiducioso che esista una soluzione polinomiale, ma se puoi dimostrarmi che mi sbaglio, puoi presentare una prova del genere invece di una richiesta golfata. In questo caso, puoi assumere P ≠ NP . Accetterò la prima prova corretta e assegnerò un premio ad essa.
Esempi
In: [[1, 1], [10, 10], [4, 5], [7, 5], [7, 7], [10, 10], [9, 8], [7, 5], [7, 5], [3, 1]]
Out: [[10, 10], [10, 10], [9, 8], [7, 7], [7, 5], [7, 5], [7, 5], [4, 5], [3, 1], [1, 1]]
In: [[4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [5, 4], [4, 5]]
Out: [[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [5, 4]]
or [[5, 4], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5]]
In: [[2, 3], [1, 1], [5, 5], [7, 1]]
Out: [[5, 5], [2, 3], [7, 1], [1, 1]]
or [[5, 5], [2, 3], [1, 1], [7, 1]]
or [[7, 1], [5, 5], [2, 3], [1, 1]]
or [[7, 1], [1, 1], [5, 5], [2, 3]]
Li ho creati a mano, quindi fatemi sapere se individuate degli errori.