在Python中找到荡舟比赛的获胜者的程序

在Python中找到荡舟比赛的获胜者的程序

假设我们有一个变量height作为数组。有n个高度不同的塔。Amal和Bimal在玩游戏。游戏规则如下:

  • Amal始终先手

  • 在每个回合,当前玩家选择高度为X的塔并将其分解为高度为Z的Y个不同塔。 [Y * Z = X; X and Y > 1]

  • 谁没法继续下去就输了比赛

我们需要找到获胜者的名字。

因此,如果输入如height = [3,1,2],则输出将为Bimal,因为最初的高度为{3,1,2}。如果Amal将第2个塔的高度分成两个高度为1的塔,那么新的高度数组将为{3,1,1,1}。Bimal可以分解高度为3的塔并使其变成高度为1的三个塔,因此Amal没有可行的步骤,Bimal获胜。

要解决此问题,我们将按照以下步骤进行操作:

  • 定义一个函数util()。这将采用限制条件,初始限制值为10^3+5
  • 结果:=大小为限制的数组,并填充为0
  • 对于2至限制-1的范围内的i,执行以下操作:
    • s:=一个新集合
    • 对于1至i的平方根取下整的范围内的j,执行以下操作:
      • d:=i/j的商,r:=i/j的余数
      • 如果r与0相同,则
      • 如果j是奇数,则
        • 将result[d]插入s
      • 如果d为奇数,则
        • 将result[j]插入s
    • j:=0
    • 当j在s中存在时,执行以下操作
      • j:=j+1
      • 我们返回结果[i]:=j
  • 返回结果
  • g:=util()
  • 从主函数中,执行以下步骤−
  • r:=0
  • 对于height中的每个i,执行以下操作:
    • r:= r XOR g[i]
  • 如果r为非零,那么
    • 返回“Amal”
  • 否则,
    • 返回“Bimal”

示例

以下是一个实现,以便更好地理解 –

def util(limit=10**3+5):
   result = [0] * limit

   for i in range(2, limit):
      s = set()
      for j in range(1, int(i**0.5)+1):
         d, r = divmod(i, j)

         if r == 0:
            if j & 1:
               s.add(result[d])
            if d & 1:
               s.add(result[j])

      j = 0
      while j in s: j += 1
      result[i] = j

   return result

g = util()

def solve(height):
   r = 0

   for i in height:
      r ^= g[i]

   if r:
      return "Amal"
   else:
      return "Bimal"

height = [3,1,2]
print(solve(height))

输入

[3,1,2]

输出

Bimal

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程