Będę rywalizować w OBI (brazylijska olimpiada informatyki, w języku angielskim) i próbuję wykonać kilka ćwiczeń z ostatnich lat. Ale nie mogę znaleźć rozwiązanie dla tego ćwiczenia (przetłumaczyłem go, więc nie może być kilka błędów):Algorytm programowania: znalezienie zwycięzcy konkursu
Chocolate konkurencji
Carlos i Paula właśnie dostała torebkę czekoladowych kulek. Jak oni jedzą wszystko zbyt szybko, zrobili konkurs:
- Będą jeść na przemian, jeden po drugim (Paula zawsze zaczyna).
- Za każdym razem mogą jeść tylko od 1 do M kuleczek, M ustalonych przez matkę Pauli, aby się nie dusić.
- Jeśli jeden zjada kulki K w swojej turze, następny nie może jeść kulki K.
- Kto nie może grać zgodnie z powyższymi zasadami, przegrywa.
W poniższym przykładzie z M = 5 i 20 piłek, Carlos zdobył:
Who plays How many ate Balls left
20
Paula 5 15
Carlos 4 11
Paula 3 8
Carlos 4 4
Paula 2 2
Carlos 1 1
Należy zauważyć, że w końcu, Carlos nie mógł jeść 2 kulki, aby wygrać, bo Paula jedli 2 w jej ostatniej turze. Ale Paula nie mogła zjeść ostatniej piłki, ponieważ Carlos zjadł 1 w swojej ostatniej turze, więc Paula nie może grać i przegrywa.
Obie są bardzo inteligentne i grają optymalnie. Jeśli istnieje sekwencja zwojów, która zapewnia mu/jej zwycięstwo niezależnie od zakrętów innych, on/ona zagra te sekwencje.
Zadanie:
Twoim zadaniem jest, aby dowiedzieć się, kto wygra konkurs, jeśli zarówno grać optymalnie.
Wejście:
Wejście zawiera tylko jedną grupę testową, która powinna być odczytywane ze standardowego wejścia (zwykle klawiatura).
Wejście zawiera 2 liczby całkowite N (2 ≤ N ≤ 1000000) i M (2 ≤ M ≤ 1000), będące N liczbą kulek i M liczbą dozwoloną na obrót.
wyjściowa:
Twój program powinien wypisać w standardowe wyjście jeden wiersz zawierający nazwę zwycięzcy.
Przykłady:
Input: Output:
5 3 Paula
20 5 Carlos
5 6 Paula
Próbowałem rozwiązać ten problem, ale nie mam pojęcia jak to zrobić.
Rozwiązanie w C można znaleźć tutaj: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/solucoes/chocolate.c.txt Ale nie mogę zrozumieć algorytmu. Ktoś zadał pytanie na temat tego problemu w innej witrynie, ale nikt nie odpowiedział.
Czy możesz wyjaśnić mi algorytm?
Oto oczekiwanych rezultatów programu: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/gabaritos/chocolate.zip
Twoja gra brzmi bardzo podobnie do gry [Nim] (http://en.wikipedia.org/wiki/Nim) - być może algorytm do grania w idealną grę jest również przydatny do zrozumienia tej gry? – sarnold
Może być konieczne przejście do forum "Theoretical CS". –
W jakim języku próbujesz go rozwiązać? Nie jestem najmądrzejszym facetem, jeśli chodzi o te problemy, ale uważam, że przechodzenie przez prosty przypadek z debuggerem jest bardzo pomocne w zrozumieniu algorytmów.BRB - Zamierzam spróbować i zakodować rozwiązanie (wtedy zgaduję, że ktoś na nie odpowiedział) –