源代码:
import math
ls1=[]
t=eval(input())
ls2=[1,2,1]
for i in range(4,1001):
for j in range(1,math.ceil(i/2)+1):
if ls2[i-j-1]==2:
ls2.append(1)
break
else:
ls2.append(2)
for i in range(t):
n = eval(input())
ls1.append(n)
for k in ls1:
if ls2[k-1]==1:
print('NO')
else:
print('YES')
运行结果:
心得: 经典博弈论问题,先用列表ls2储存获胜的基数,即下标+1表示牌数,1,2分别表示Bob,Alice获胜,后面的牌数谁获胜通过遍历‘学习’前面的基数来组成新的基数,具体就是考虑Bob是否有先摸牌后能否达到前面他自己必胜的牌数的可能性,也就是类似第二轮(Alice)的后手(设其中一位摸一次牌为一轮),所以 ls2[i-j-1]==2,如果存在,即这一轮Bob获胜,存入新的基数1,否则存入2,后面以此类推。然后再与输入的牌数进行相应匹配即可