【发布时间】:2012-05-20 13:19:34
【问题描述】:
我将参加 OBI(巴西信息学奥林匹克,英语),我正在尝试过去几年的一些练习。但是我找不到这个练习的解决方案(我翻译了它,所以可能会有一些错误):
巧克力大赛
Carlos 和 Paula 刚拿到一袋巧克力球。因为他们会吃 一切都太快了,他们进行了比赛:
- 他们会一个接一个地交替进食(Paula 总是开始)。
- 每次只能吃 1 到 M 个丸子,M 由 Paula 的妈妈决定,所以他们不会窒息。
- 如果一个人轮到他/她吃 K 球,下一个不能吃 K 球。
- 不能按以上规则比赛的人输。
在下面的示例中,M = 5 和 20 个球,卡洛斯赢了:
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
请注意,最后,卡洛斯无法吃掉 2 个球来获胜,因为宝拉在最后一回合吃了 2 个。但是保拉吃不到最后一个球,因为卡洛斯在最后一回合吃了1个,所以保拉不能打,输了。
两者都非常聪明并且发挥最佳。如果有一系列回合可以确保他/她的胜利独立于其他回合,那么他/她将玩这些序列。
任务:
你的任务是找出如果双方都发挥最佳,谁将赢得比赛。
输入:
输入只包含一个测试组,应该从标准输入(通常是键盘)读取。
输入有 2 个整数 N (2 ≤ N ≤ 1000000) 和 M (2 ≤ M ≤ 1000),其中 N 为球数,M 为每圈允许的球数。
输出:
您的程序应该在标准输出中打印出包含获胜者姓名的一行。
例子:
Input: Output:
5 3 Paula
20 5 Carlos
5 6 Paula
我一直在尝试解决这个问题,但我不知道如何解决。
可以在此处找到 C 中的解决方案:http://olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/solucoes/chocolate.c.txt 但我无法理解算法。有人在另一个网站上发布了有关此问题的问题,但没有人回复。
你能解释一下算法吗?
【问题讨论】:
-
你的游戏听起来和Nim的游戏非常相似——也许玩完美游戏的算法也有助于理解这个游戏?
-
这可能需要去'Theoretical CS'论坛
-
你想用什么语言解决它?当涉及到这些问题时,我不是最聪明的人,但我发现使用调试器逐步完成一个简单的案例对于理解算法非常有帮助。 BRB - 我将尝试编写一个解决方案(到那时我猜有人会回答这个问题)
-
sarnold:我会阅读有关 Nim 的信息,看起来很有帮助。 Nathaniel:对不起,如果发错论坛了;这是我的第一篇文章。 Rob:问题并没有真正解决问题。 Olympiad 的网站上有一个解决方案(C 语言),但我看不懂算法。
-
感谢 sarnold,维基百科上的文章真的很有帮助。巧克力比赛与此处显示的游戏相同:en.wikipedia.org/wiki/…。我还没有测试解决方案,但我明天会测试它。
标签: algorithm