204 小R和小S的金币分配问题 题解 | 豆包MarsCode AI刷题

226 阅读2分钟

问题描述

小R和小S在探险过程中发现了一个装满金币的宝箱。宝箱里有NN枚金币,他们决定按照以下规则来分配:

  1. 小R和小S轮流选取金币,且小R先选。
  2. 如果当前剩余的金币数量为偶数时,可以选择拿走一半的金币,或者只拿走一枚金币。
  3. 如果当前剩余的金币数量为奇数时,只能拿走一枚金币。

两人都会采取最优策略来获取更多的金币。现在,你需要计算小R和小S最终各自拿走的金币数量。

题目分析

这个问题是一个典型的动态规划或者博弈论问题,但由于规则较为简单,可以通过模拟游戏过程并应用一些策略来求解。

策略分析

  1. 当剩余金币为奇数时,无论轮到谁,都只能拿走一枚金币,因此这一步没有策略可选。

  2. 当剩余金币为偶数时,当前玩家有两个选择:

    • 拿走一枚金币,使剩下的金币数量变为奇数,让对手在下一轮只能拿走一枚金币。

    • 拿走一半的金币,使剩下的金币数量减半,但需要注意,如果减半后对手面临的金币数量仍然是偶数且足够多时,对手可能会继续选择减半,从而拿到更多的金币。

基于以上分析,我们可以制定一个策略:如果当前玩家面临的偶数金币数量的四分之一大于1且为偶数,那么当前玩家应该选择拿走一枚金币,迫使对手面对的剩余金币为奇数。否则,当前玩家应该选择拿走一半的金币。

实现思路

  1. 使用一个循环模拟游戏过程,直到所有金币被拿走。

  2. 每次根据当前金币数量和玩家轮次,选择最优策略进行金币的分配。

代码实现

以下为python语言的实现代码,如有需要可以参考。

def solution(N: int) -> list:
    result = [0,0] # 小R和小S分别获得的金币数量

    while N > 0:
        for player in range(2): # 0表示小R,1表示小S
            if N % 2 != 0: # 剩余金币为奇数,只能拿走一枚
                result[player] += 1
                N -= 1
            elif N > 0: # 剩余金币为偶数,判断最优策略
                # 如果一半的一半(即四分之一)还是偶数且大于1,选择拿走一枚
                if (N // 2) % 2 == 0 and (N // 2)//2 > 1:
                    result[player] += 1
                    N -= 1
                else: # 否则选择拿走一半
                    result[player] += N // 2
                    N //= 2
                    
    return result

总结

这个题目的关键在于理解并应用最优策略,即在面临偶数金币时,当前玩家需要判断是拿走一半还是一枚金币,以确保自己能够获得尽可能多的金币。