我将参加 OBI(巴西信息学奥林匹克,英语),我正在尝试过去几年的一些练习。但是我找不到这个练习的解决方案(我翻译了它,所以可能会有一些错误):
巧克力大赛
卡洛斯和宝拉刚拿到一袋巧克力球。由于他们吃得太快,他们进行了比赛:
- 他们会一个接一个地交替进食(宝拉总是开始)。
- 每次只能吃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但我无法理解该算法。有人在另一个网站上发布了关于这个问题的问题,但没有人回复。
你能解释一下算法吗?
以下是该计划的预期输出:http: //olimpiada.ic.unicamp.br/passadas/OBI2009/res_fase2_prog/programacao_n2/gabaritos/chocolate.zip