Układając książki, zwykle chcesz umieścić największe na dole, a najmniejsze na górze. Jednak moja ukryta OCD sprawia, że czuję się bardzo nieswojo, jeśli mam dwie książki, w których jedna jest krótsza (na wysokości), ale szersza od drugiej. Bez względu na to, w jakiej kolejności je złożę, górna książka będzie rozciągać się poza dolną książkę z jednej strony.
Na przykład powiedzmy, że jedna książka ma wymiary, (10,15)
a inna ma wymiary (11,14)
. Bez względu na to, w którą stronę je postawię, dostaję nawis. Ale jeśli mam książki o wymiarach (4,3)
i (5,6)
, mogę uniknąć przewieszania, umieszczając ten ostatni pod pierwszym.
Na potrzeby tego wyzwania rozważymy zwisy tylko w odniesieniu do książki bezpośrednio poniżej . Na przykład jeśli mam stos (5,5)
, (3,3)
, (4,4)
(nie, że każda osoba przy zdrowych zmysłach by tego nie zrobił), liczy top książkę jako zwis, choć nie wykracza poza dolną książki. Podobnie, stos (3,3)
, (3,3)
, (4,4)
posiada tylko jeden występ, mimo górnym książki wykraczającego poza dolnej jeden.
Wyzwanie
Biorąc pod uwagę listę par liczb całkowitych dla wymiarów książek, posortuj te pary / książki tak, aby liczba nawisów była minimalna. Nie wolno obracać książek - chcę, aby wszystkie kolce były skierowane w tym samym kierunku. Jeśli istnieje wiele rozwiązań z taką samą liczbą zwisów, możesz wybrać dowolną taką kolejność. Twój algorytm sortowania nie musi być stabilny. Wdrożenie może zakładać, że wymiary książki są mniejsze niż 2 16 każdy.
Złożoność czasowa: aby uczynić to nieco bardziej interesującym, asymptotyczna złożoność algorytmu najgorszego przypadku musi być wielomianowa pod względem wielkości stosu. Więc nie możesz po prostu przetestować każdej możliwej permutacji. Dołącz krótki dowód optymalności i złożoności algorytmu oraz opcjonalnie wykres pokazujący skalowanie dla dużych losowych danych wejściowych. Oczywiście nie można użyć maksymalnego rozmiaru danych wejściowych jako argumentu działania kodu w O (1).
Możesz napisać program lub funkcję, wziąć dane wejściowe za pomocą argumentu STDIN, ARGV lub funkcji w dowolnym dogodnym (nieprzetworzonym) formacie listy i wydrukować lub zwrócić wynik.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Jestem pewien, że istnieje rozwiązanie wielomianowe, ale jeśli możesz udowodnić, że się mylę, możesz przedstawić taki dowód zamiast zgłoszenia w golfa. W takim przypadku możesz założyć P ≠ NP . Przyjmę pierwszy poprawny taki dowód i przyznam mu nagrodę.
Przykłady
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]]
Stworzyłem je ręcznie, więc daj mi znać, jeśli zauważysz jakieś błędy.