Mam kupę czystych skarpet, które chcę poskładać w pary. Niestety mogę wziąć skarpetki tylko z dowolnego końca stosu, a nie ze środka. Co więcej, mogę jednocześnie usunąć skarpetki ze stosu pasującej pary. Moją strategią jest najpierw podzielić stos na jeden lub więcej mniejszych stosów. Myślę, że niektóre przykłady to wyjaśnią. Przedstawię każdą skarpetę jako dodatnią liczbę całkowitą (pasujące liczby całkowite oznaczają równe skarpetki).
Jeśli początkowy stos skarpet to
1 2 3 3 2 1
wtedy nie muszę robić żadnego podziału. Mogę usunąć obie 1
skarpetki, potem obie 2
skarpety, a następnie obie 3
skarpetki.
Jeśli zamiast tego początkowy stos to
1 2 3 2 3 1
potem muszę go najpierw podzielić, ponieważ nie będę w stanie sparować wszystkich skarpet po prostu usuwając je z końca. Jedną z możliwości jest podzielenie go na dwa stosy
1 2 3 and 2 3 1
Teraz mogę zdjąć 1
skarpetki, odejść 2 3 and 2 3
, następnie 3
skarpetki, odejść 2 and 2
i wreszcie 2
skarpetki.
Twoja praca
Biorąc pod uwagę początkowy stos skarpet, napisz program, który podzieli go na mniejsze stosy, które pozwolą mi posortować skarpetki. Twój program powinien podzielić stos na możliwie najmniejszą liczbę stosów (jeśli istnieje wiele najlepszych rozwiązań, potrzebujesz tylko jednego).
Dane wejściowe zostaną podane w postaci listy, łańcucha rozdzielanego lub innej dogodnej formy. Będzie zawierał tylko liczby całkowite pomiędzy 1
i pewną maksymalną wartość n
, przy czym każda liczba całkowita będzie występować dokładnie dwa razy.
Dane wyjściowe powinny składać się z listy danych wejściowych podzielonej na mniejsze listy, podane w dowolnej dogodnej formie.
Przykłady
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Zauważ, że nie jest to jedyne dozwolone wyjście dla większości tych danych wejściowych. W drugim przypadku na przykład dane wyjściowe 1 2; 1 2
lub 1 2 1; 2
byłyby również akceptowane.
Dzięki Sp3000 za sugestie dotyczące testów!
Nienawidzę spędzać długiego czasu na sortowaniu ubrań, więc skróć swój kod tak krótko, jak to możliwe. Najkrótsza odpowiedź w bajtach wygrywa!
Notatki
- Nie chcę patrzeć za skarpetę, aby sprawdzić, czy jest tam pasująca para, więc zabranie obu skarpet w parę z tego samego końca nie jest dozwolone. Np. Jeśli stos jest
1 1 2 2
, to nie będziesz mógł zostawić go jako jednego stosu i wziąć obu1
skarpet z lewego końca.
123213
można podzielić na 1; 23; 213
( 1; 23; 213
-> 1; 2; 21
-> ; 2; 2
)?
123213
przy użyciu tylko dwóch stosów, twoja odpowiedź musiałaby dać jeden z podziałów na dwa stosy.