在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