Cóż, kiedy kupuję prezenty dla moich dwóch żon, chcę, aby poczuły się dla mnie równie ważne, ale ciężko jest robić zakupy z ustalonymi budżetami. Zamiast tego kupuję kilka rzeczy i dzielę je na dwie grupy o możliwie równej wartości. Następnie kupuję kilka czekoladek, aby naprawić resztę.
Ale nie chcę tego robić, gdy mój komputer może to zrobić. I ty też nie. Rozwiąż ten problem, aby następnym razem, gdy będziesz musiał podzielić prezenty między swoje żony, wiesz, że będzie to łatwe.
Wejście
1 tablica elementów (N * 2), w których N * 2 jest określony w pierwszym wierszu.
Elementy tablicy w następującym wierszu.
Wynik
2 tablice N elementów, z których każda:
Różnica (Suma elementów tablicy 1) i (Suma elementów tablicy 2) jest jak najbliższa zeru.
Przykład
Wejście
4
1 2 3 4
Wynik
1 4
2 3
diff=0
Oświadczenie : Nie mam dwóch żon. Ale kiedy czuję się źle, wyobrażam sobie, że mam dwie żony. I nagle jestem wdzięczny i szczęśliwy, że mam tylko jeden. :RE
źródło
1 1 1 1 1 5
poprawna odpowiedź to1 1 1
|1 1 5
, podczas gdy1 1 1 1 1
|5
miałoby więcej sensu.Odpowiedzi:
Jawa
Próbowanie rozwiązania tego problemu w dwóch fazach:
Dane wejściowe jak
jest już rozwiązany po fazie 1 jak np
i dane wejściowe jak
będą potrzebować obu faz, aby
(po pierwszej fazie) staje się wynikiem
Chociaż mogę zagwarantować, że ta próba zawsze zapewni rozwiązanie, nie mogę udowodnić, że we wszystkich przypadkach można znaleźć optymalne rozwiązanie. Jednak przy ograniczeniu list o takiej samej wielkości wydaje się całkiem realistyczne, że nie pozostały żadne narożne skrzynki. Udowodnij, że się mylę ;-)
Program na ideone.com
źródło
Brachylog 2
Wypróbuj online!
To konkurs popularności, ale to niekoniecznie oznacza, że języki gry w golfa są źle dopasowane. (Naprawdę, powinienem był odpowiedzieć w Jelly, ponieważ odpowiedzi Jelly mają tendencję do otrzymywania nieproporcjonalnej liczby głosów poparcia z jakiegoś powodu, niezależnie od tego, kto je przesyła lub jak są golfa, ale Brachylog jest bardziej czytelny.)
Zaczynamy od pobrania listy wszystkich permutacji wejścia (
pᶠ
) i podzielenia każdego (ᵐ
) na dwie równe części (ḍ
; moglibyśmy dać indeks dolny, jeśli z jakiegoś powodu masz więcej niż dwie żony). Następnie porządkujemy podzielone permutacje ({…}ᵒ
), biorąc sumę (+
) każdej (ᵐ
) połowy, biorąc różnicę bezwzględną (tj.o-
„Różnicę uporządkowaną”) i wykorzystując te różnice do zdefiniowania porządku sortowania. Najlepszy wynik jest pierwszy, więc bierzemy na czele listy,h
aby uzyskać wynik.źródło
Matematyka
Formularze wejściowe
Ciąg wejściowy należy pobrać przez STDIN.
assets
odnosi się do kwot, które zostaną rozdzielone między żony (lub bliźnięta).length
to liczba aktywów.Dla obecnych celów założymy, że aktywa składają się z liczb całkowitych od 1 do 20.
Przetwarzanie
Czy dystrybucja jest niesprawiedliwa? Wybierz inny.
@ Konstruktor zauważa, że żona 2 może zakwestionować fakt, że żona 1 ma wszystkie najlepsze aktywa. Tak więc poniższe dają wszystkie „sprawiedliwe” (różnica = najniższa różnica) akcje dla żony 1; żona 2 otrzymuje pozostałe aktywa; zero odnosi się do różnicy aktywów dla żon. Istnieje 5448 sposobów dystrybucji aktywów o wadze od 1 do 20. Wyświetlanych jest tylko kilka wierszy.
Format to
Wcześniejsze przesłanie można znaleźć wśród edycji. Jest o wiele bardziej nieefektywny, opierając się na nim
Permutations
.źródło
jot
Pod tym linkiem znajduje się ściągawka wszystkich prymitywów J , na wypadek gdybyś chciał śledzić w domu. Pamiętaj: J jest ogólnie odczytywany od prawej do lewej, czyli
3*2+1
7, a nie 9. Każdy czasownik (J dla funkcji) jest albo monadyczny, czyli z przodu podobnyf y
, lub dyadyczny, więc pomiędzy podobnymix f y
.Uwagi i objaśnienia:
u/
oznacza „złóżu
”, więc wykonaj operację binarną nad każdym elementem na liście. Na przykład:+/
oznacza Fold Plus lub Sum ;<.
jest mniejszy , więc<./
oznacza Krotnie mniejszy lub Minimalny .u"1
oznacza „działaju
na komórkach 1-wymiarowych”, tj. w każdym rzędzie. Zwykle czasowniki w J są atomowe lub odnoszą się do całego argumentu. Odnosi się to do obu argumentów, jeśli czasownik jest używany dyadycznie (z dwoma argumentami). Rozważ następujące:#:
to czasownik, który rozwija liczbę do reprezentacji binarnej. Kiedy użyjesz go na liście zawierającej więcej niż jeden element, spowoduje to również prawidłowe wyrównanie wszystkich liczb, dzięki czemu#:i.2^n
otrzymasz każdy ciąg binarny o długościn
./.
, gdy jest stosowany stopniowo, nazywa się Kluczem . Wykorzystuje elementy listy po lewej stronie jako klucze, a te po prawej stronie jako wartości. Grupuje razem każdy zestaw wartości, które mają wspólny klucz, a następnie wykonuje na nich pewne operacje.W przypadku
]/.
operacji jest to tylko czasownik tożsamości, więc nie dzieje się tam nic specjalnego, ale fakt, że/.
podzielimy listę dla nas, jest ważny. Dlatego tworzymy listy binarne: aby dla każdej listy ("1
) można było podzielić prezenty dla żon na wszystkie możliwe sposoby.1!:1]1
i1!:2&2
są odpowiednio operacjami wczytywania i zapisywania.1!:n
Częścią jest przechodni, a druga liczba to uchwyt pliku.1
jest w konsoli,2
jest w konsoli, i3 4 5
są stdin, stdout i stderr. Używamy również".
podczas czytania, aby przekonwertować ciągi wejściowe na liczby.źródło
Clojure
Test
źródło
[1 4 5 6 7 8]
twojego programu obliczono,[8 5 4]
[7 6 1]
Diff 3
gdzie istnieją wyraźne rozwiązania z różnicą 1.MATLAB
Oto moje rozwiązanie:
Na przykład obecna lista w moim kodzie źródłowym powoduje:
który jest równy 16.
Jeśli zagram w mój kod, co jest mniej zabawne, otrzymam bardzo niezoptymalizowane 132 znaki. Pobij to ;)
źródło
PHP
Ostrzeżenie: bardzo brudny kod
Próbuje każdej możliwej permutacji tablicy wejściowej.
Próbka ideone dla
4/1 2 3 4
: http://ideone.com/gIi174źródło
Pyton:
lub nieco golfizowany:
Lub jeszcze bardziej golfizowany, ponieważ połowa linii to tylko makijaż. (zakładając, że mogę po prostu zrzucić surową tablicę wewnętrzną, ponieważ nie jest to określone w op) Możesz zostawić
print
(na przykład) interaktywną powłokę i dodać[::-1]
(na samym końcu po[0]
), jeśli naprawdę chcesz ostatnia różnica.(wyniki w
(0, ((1, 2, 7, 8), (3, 4, 5, 6)))
)Jest to jednak brutalne wymuszanie wszystkich możliwych kombinacji i nie powinno być uważane za zdalnie skuteczne. Jeśli jednak lista o równej długości nie ma znaczenia, działałoby to również (na dużych tablicach):
Na przykład pod tym kodem działa on z niewielką różnicą: 500k przy wartości maks. 10 ^ 10 to niewiele, że tak powiem. Jest to również o wiele szybsze: tam, gdzie drugi kod prawdopodobnie nie skończyłby się przed upływem roku (i to jest bardzo optymistyczne), działa to w około pół sekundy, nawet jeśli twój przebieg może się różnić.
źródło
Pisz Haskell
Wykorzystałem monadę listy, aby ją podzielić.
Potem robimy oceniającego.
A potem funkcja, która zminimalizuje różnicę.
I coś, co łączy je wszystkie.
Następnie parser.
I formatator wyjściowy.
A teraz program
Przykład:
źródło