Tôi sẽ cạnh tranh trong OBI (Olympic tin học Brazil, bằng tiếng Anh) và tôi đang thử một vài bài tập từ những năm qua. Nhưng tôi không thể tìm thấy một giải pháp cho bài tập này (tôi dịch nó, vì vậy có thể có một vài sai sót):Thuật toán lập trình: tìm người chiến thắng trong cuộc thi
Sôcôla thi
Carlos và Paula chỉ có một túi bóng sô cô la. Vì họ sẽ ăn mọi thứ quá nhanh, họ đã thực hiện một cuộc thi:
- Họ sẽ ăn luân phiên, cái khác (Paula luôn bắt đầu).
- Mỗi lần, họ chỉ có thể ăn từ 1 đến M quả bóng, M do mẹ của Paula quyết định, vì vậy họ không bị nghẹt thở.
- Nếu một người ăn K lần lượt, người tiếp theo không thể ăn quả K.
- Bất kỳ ai không thể chơi theo các quy tắc trên đều bị mất.
Trong ví dụ dưới đây với M = 5 và 20 quả bóng, Carlos đã giành được:
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
Lưu ý rằng cuối cùng, Carlos không thể ăn 2 quả bóng để giành chiến thắng, bởi vì Paula ăn 2 trong lượt cuối cùng của cô. Nhưng Paula không thể ăn quả bóng cuối cùng, bởi vì Carlos ăn 1 ở lượt cuối cùng của mình, vì vậy Paula không thể chơi và thua.
Cả hai đều rất thông minh và chơi tối ưu. Nếu có một chuỗi lượt để đảm bảo anh ta/cô ấy chiến thắng độc lập với lượt của người khác, anh ta/cô ấy sẽ chơi các trình tự này.
Nhiệm vụ:
Nhiệm vụ của bạn là tìm ra ai sẽ thắng cuộc thi nếu cả hai đều chơi tối ưu.
Nhập:
Đầu vào chỉ chứa một nhóm thử nghiệm, được đọc từ đầu vào chuẩn (thường là bàn phím).
Đầu vào có 2 số nguyên N (2 ≤ N ≤ 1000000) và M (2 ≤ M ≤ 1000), là N số quả bóng và M số được phép cho mỗi lượt.
Đầu ra:
Chương trình của bạn nên in, ở đầu ra tiêu chuẩn, một dòng chứa tên của người chiến thắng.
Ví dụ:
Input: Output:
5 3 Paula
20 5 Carlos
5 6 Paula
Tôi đã cố gắng để giải quyết vấn đề, nhưng tôi không có ý tưởng như thế nào.
Có thể tìm thấy giải pháp trong C tại đây: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/solucoes/chocolate.c.txt Nhưng tôi không thể hiểu thuật toán. Ai đó đã đăng câu hỏi về vấn đề này ở một trang web khác, nhưng không ai trả lời.
Bạn có thể giải thích cho tôi thuật toán không?
Sau đây là các kết quả đầu ra dự kiến của chương trình: http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/gabaritos/chocolate.zip
Trò chơi của bạn có vẻ rất giống với trò chơi [Nim] (http://en.wikipedia.org/wiki/Nim) - có lẽ thuật toán để chơi trò chơi hoàn hảo cũng hữu ích cho việc hiểu trò chơi này? – sarnold
Điều này có thể cần phải đi đến diễn đàn 'Lý thuyết CS' –
Ngôn ngữ nào bạn đang cố gắng giải quyết nó? Tôi không phải là người thông minh nhất khi nói đến những vấn đề này nhưng tôi thấy rằng bước qua một trường hợp đơn giản với một trình gỡ rối sẽ rất hữu ích trong việc hiểu các thuật toán.BRB - Tôi sẽ thử và mã hóa một giải pháp (sau đó tôi đoán ai đó sẽ trả lời câu hỏi này) –