Mam trochę książek i półkę na książki. Chciałbym umieścić jak najwięcej książek na półce, ale mam pewną zasadę. Wszystkie wymiary książek (wysokość, szerokość i głębokość) powinny tworzyć nie rosnącą sekwencję na półce.
Oznacza to, że każda książka musi być co najmniej tak wysoka, jak ta po sobie. To samo dotyczy szerokości i głębokości. Nie można obracać książek w celu zamiany ich wysokości, szerokości i głębokości.
Powinieneś napisać program lub funkcję, która podając wymiary wszystkich książek jako dane wyjściowe lub zwraca maksymalną liczbę książek, jakie mogę umieścić na półce.
Wejście
- Lista trojaczków liczb całkowitych dodatnich, przy czym każda trojaczka określa wysokość, szerokość i głębokość książki.
- Na liście wejściowej będzie co najmniej jeden triplet.
- Dwie książki mogą mieć tę samą długość wzdłuż dowolnej liczby wymiarów.
Wynik
- Pojedyncza dodatnia liczba całkowita, maksymalna liczba książek, które mieszczą się na półce, przestrzegając reguły.
Złożoność czasowa
Algorytm powinien mieć wielomian złożoności w najgorszym przypadku w liczbie książek. Oznacza to, że na przykład wszystkie złożone zawirowania czasowe są prawidłowe: O (N ^ 3), O (log (N) * N ^ 2), O (N) i następujące są nieprawidłowe: O (2 ^ N), O (N!), O (N ^ N).
Przykłady
Dane wejściowe => Dane wyjściowe
(1, 1, 1) => 1
(5, 2, 5), (1, 3, 5) => 1
(5, 2, 5), (1, 2, 5) => 2
(2, 2, 2), (2, 2, 2), (2, 2, 2), (1, 3, 6) => 3
(1, 2, 5), (1, 3, 5), (1, 2, 8), (1, 2, 5), (7, 7, 7) => 4
(5, 19, 3), (9, 4, 16), (15, 16, 13), (7, 4, 16), (1, 13, 14), (20, 1, 15), (9, 8, 19), (4, 11, 1) => 3
(1, 1, 18), (1, 13, 7), (14, 1, 17), (8, 15, 16), (18, 8, 12), (8, 8, 15), (10, 1, 14), (18, 4, 6), (10, 4, 11), (17, 14, 17), (7, 10, 10), (19, 16, 17), (13, 19, 2), (16, 8, 13), (14, 6, 12), (18, 12, 3) => 5
To jest golf golfowy, więc wygrywa najkrótszy wpis.
Powiązane interesujące wyzwanie związane z sortowaniem książek: Sortowanie książek .
źródło
Odpowiedzi:
Python 3: 436 bajtów
Na początku widziałem to jako kompletny problem NP polegający na znalezieniu najdłuższej prostej ścieżki na ukierunkowanym wykresie z cyklami. Jednak każdy cykl na wykresie (w rzeczywistości kompletny podrozdział) może być reprezentowany jako pojedynczy wierzchołek. Innymi słowy, traktuj identyczne książki jak jedną książkę, którą należy umieścić na półce jako całość. Następnie możemy zbudować ukierunkowany wykres acykliczny, w którym a-> b oznacza, że b może podążać za znakiem na półce. Na koniec znajdujemy maksymalną wysokość drzewa (drzew) za pomocą metody rekurencyjnej.
źródło
Pyth, 40 bajtów
Nie szybko, ale jest wielomianowy.
Odpowiednik Python3:
źródło
Python 2, 231 bajtów
Wypróbuj tutaj
Mój program obecnie źle podaje dwa ostatnie przykłady. Czy ktoś może mi pomóc to naprawić? Dzięki.
Sortuję listę wszystkich 6 możliwych rzędów permutacji 3 wymiarów, następnie sprawdzam, jaka jest najdłuższa relacja ciągłego uporządkowania na liście, a następnie znajduję maksimum z nich.
Wiem też, czy można grać w golfa o wiele więcej, ale nie mogłem wymyślić, czy mógłbym
reduce
to zrobić. Mówiąc najprościej, ten sposób był najłatwiejszy do zrobienia w rozsądnym czasie bez eksplozji mojego mózgu.źródło