我将参加OBI(巴西信息学奥林匹克竞赛),我正在尝试解决去年的一些练习题。但是对于这个问题,我找不到答案(我翻译了一下,所以可能会有一些错误):
巧克力比赛
卡洛斯和宝拉刚刚拿到了一袋巧克力球。由于他们会吃得太快,所以他们决定比赛:
- 他们将交替吃巧克力球(宝拉始终先开始)。 - 每次,他们只能吃掉1至M颗巧克力球,其中M由宝拉的母亲决定,以免他们噎住。 - 如果一个人在轮到他时吃了K颗巧克力球,那么接下来的人不能吃K颗巧克力球。 - 谁不能根据以上规则发挥就输了。
在下面的例子中,当M = 5且共有20颗巧克力球时,卡洛斯获胜:
请注意,最终Carlos没能吃掉2个球获胜,因为Paula在她的最后一轮吃了2个。但是Paula无法吃掉最后一个球,因为Carlos在他的最后一轮吃了1个,所以Paula不能继续游戏并输掉比赛。
两人都非常聪明,能够最优地进行游戏。如果有一个回合序列可以确保他/她独立于对手的回合而获胜,那么他/她将执行这些序列。
任务:
你的任务是找出在两个人都采取最优策略的情况下谁会获胜。
输入:
输入只包含一个测试组,应从标准输入(通常是键盘)中读取。
输入有两个整数N(2≤N≤1000000)和M(2≤M≤1000),其中N是球的数量,M是每轮允许拿的数量。
输出:
您的程序应在标准输出中打印一行,其中包含获胜者的名称。
示例:
巧克力比赛
卡洛斯和宝拉刚刚拿到了一袋巧克力球。由于他们会吃得太快,所以他们决定比赛:
- 他们将交替吃巧克力球(宝拉始终先开始)。 - 每次,他们只能吃掉1至M颗巧克力球,其中M由宝拉的母亲决定,以免他们噎住。 - 如果一个人在轮到他时吃了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
请注意,最终Carlos没能吃掉2个球获胜,因为Paula在她的最后一轮吃了2个。但是Paula无法吃掉最后一个球,因为Carlos在他的最后一轮吃了1个,所以Paula不能继续游戏并输掉比赛。
两人都非常聪明,能够最优地进行游戏。如果有一个回合序列可以确保他/她独立于对手的回合而获胜,那么他/她将执行这些序列。
任务:
你的任务是找出在两个人都采取最优策略的情况下谁会获胜。
输入:
输入只包含一个测试组,应从标准输入(通常是键盘)中读取。
输入有两个整数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