tło
Przegrupowanie Nierówność jest nierówność, która opiera się na przestawienie cyfr. Jeśli mam dwie listy liczb o tej samej długości, x 0 , x 1 , x 2 ... x n-1 i y 0 , y 1 , y 2 ... y n-1 o tej samej długości, gdzie I mogę zmienić kolejność liczb na liście, sposobem na maksymalizację sumy x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 jest posortowanie 2 list w nie malejące zamówienie.
Przeczytaj artykuł w Wikipedii tutaj.
Zadanie
Napisałbyś program, który pobiera dane wejściowe ze STDIN lub funkcję, która akceptuje 2 tablice (lub powiązane kontenery) liczb (o tej samej długości).
Zakładając, że napiszesz funkcję, która akceptuje 2 tablice (a i b), znajdziesz liczbę sposobów na zmianę kolejności liczb w drugiej tablicy (b), aby zmaksymalizować:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
W takim przypadku, jeśli tablica b wynosi [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (wskaźniki dla przejrzystości),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (zamień dwie 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (zamień dwie 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (zamień dwie 3 i zamień dwie 2)
są uważane za różne ustalenia. Oryginalna tablica sama w sobie również liczy się jako możliwa rearanżacja, jeśli również maksymalizuje sumę.
W przypadku danych wejściowych STDIN można założyć, że długość tablic jest podana przed tablicami (proszę podać, aby z nich korzystać), lub że tablice są podane w różnych wierszach (proszę również podać).
Oto 4 możliwe dane wejściowe (dla wygody):
5 1 1 2 2 2 1 2 2 3 3 (length before arrays)
1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)
1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)
5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)
W przypadku danych wyjściowych możesz zwrócić odpowiedź (jeśli napiszesz funkcję) lub wydrukować odpowiedź do STDOUT. Możesz wybrać wyjście mod 10 9 +7 (od 0 do 10 9 +6), jeśli jest to wygodniejsze.
Przypadki testowe (i wyjaśnienia):
[1 1 2 2 2] [1 2 2 3 3] => 24
Pierwsze 2 wpisy muszą mieć wartość 1 i 2. Ostatnie 3 wpisy to 2, 3 i 3. Istnieją 2 sposoby rozmieszczenia tych 2 między pierwszymi 2 wpisami a ostatnimi 2 wpisami. Wśród pierwszych 2 wpisów są 2 sposoby ich zmiany. Wśród 2 ostatnich wpisów istnieje 6 sposobów na ich zmianę.
[1 2 3 4 5] [6 7 8 9 10] => 1
Jest tylko jeden sposób, czyli ustawienie podane w tablicach.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Każda możliwa permutacja drugiej tablicy jest poprawna.
Test Dennisa: Pastebin => 583159312 (mod 1000000007)
Punktacja:
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.
W przypadku remisu remisy zostaną zerwane przez czas złożenia, co sprzyja wcześniejszemu zgłoszeniu.
Uwaga:
Pojemniki mogą być nieposortowane.
Liczby całkowite w pojemnikach mogą być zerowe lub ujemne.
Program musi działać wystarczająco szybko (najwyżej godzinę) dla tablic o skromnych rozmiarach (około 10000 długości).
Inspirowane tym pytaniem na temat wymiany stosów matematycznych.
źródło
[. . .]
odpowiedź plzOdpowiedzi:
CJam,
3026 bajtówWypróbuj online w interpretatorze CJam .
Uzupełnia ten przypadek testowy krócej niż sekundę:
Uruchomienie go w tłumaczu online powinno zająć mniej niż 10 sekund.
Algorytm
Wynik nie zależy od kolejności A , więc możemy założyć, że jest on posortowany. Oznacza to, że B należy również posortować, aby uzyskać maksymalny iloczyn punktowy.
Teraz, jeżeli r 1 ,… r n są długością serii posortowanego A , to ∏r k ! różne przegrupowania elementów A, które wciąż powodują rosnącą kolejność.
Podobnie, jeśli s 1 ,… s n są długością serii posortowanego B , to są ∏s k ! różne przegrupowania elementów B które wciąż powodują rosnącą kolejność.
Zlicza to jednak wszystkie pary wiele razy. Jeśli weźmiemy pary odpowiednich elementów posortowanego A i posortowanego B i zdefiniujemy t 1 ,… t n jako długość serii wynikowej tablicy, ∏t k ! jest wyżej wymienionym mnożnikiem.
Zatem pożądanym wynikiem jest (∏r k !) × (∏s k !) ÷ (∏t k !) .
Kod
źródło
Pyth,
2928 bajtówWypróbuj online w kompilatorze Pyth .
Algorytm
Wynik nie zależy od kolejności A , więc możemy założyć, że jest on posortowany. Oznacza to, że B należy również posortować, aby uzyskać maksymalny iloczyn punktowy.
Teraz, jeżeli r 1 ,… r n są długością serii posortowanego A , to ∏r k ! różne przegrupowania elementów A, które wciąż powodują rosnącą kolejność.
Podobnie, jeśli s 1 ,… s n są długością serii posortowanego B , to są ∏s k ! różne przegrupowania elementów B, które wciąż powodują rosnącą kolejność.
Zlicza to jednak wszystkie pary wiele razy. Jeśli weźmiemy pary odpowiednich elementów posortowanego A i posortowanego B i zdefiniujemy t 1 ,… t n jako długość serii wynikowej tablicy, ∏t k ! jest wyżej wymienionym mnożnikiem.
Zatem pożądanym wynikiem jest (∏r k !) × (∏s k !) ÷ (∏t k !) .
Kod
Weryfikacja
Pseudolosowo wygenerowałem 100 przypadków testowych o długości 6, które rozwiązałem za pomocą powyższego kodu i tego podejścia opartego na brutalnej sile:
Oto wyniki:
Aby sprawdzić, czy przesłany dokument spełnia wymagania dotyczące prędkości, uruchomiłem go w tym przypadku testowym .
źródło
Matlab, 230 bajtów
Wykonanie
Testowa Dennisa:
Wyjścia:
źródło
C ++, 503 bajty
(tylko dla zabawy, język nie golfowy)
Wersja bez golfa:
źródło