题意:采用最佳决策,尽量使A赢,A赢的条件是既不能拿到和为3的倍数的数,又不能是最后一个拿数的人。
code:
# 0 有偶数个:
# 将所有插在第一位和第二位之间,A取任意一个,中间的0相当于无效操作,
# 如果1和2的个数都是0个,A必输;
# 如果1或2的个数不为0个,少于等于2个时,石子取完,判定A输,大于等于3个是,A拿到3的倍数个,A必输;
# 如果1和2的个数都不为0,A先去少的那一个时,A必赢;
# 0 有奇数个:
# 将所有插在第一位和第二位之间,之后相当于 新的一轮博弈 且是A开头,
# 如果1和2 个数都为0,A必输;
# 如果1或者2的个数为0,如果个数是2个,A不一定赢,如果个数是1个,B赢,如果个数是3个A赢;
# 如果1和2的个数都不为0,如果多的比少的多2个,A不一定赢,如果多1个,B赢,如果多3个,A赢;
class Solution:
def stoneGameIX(self, stones: List[int]) -> bool:
n = len(stones)
cnt0, cnt1, cnt2 = 0, 0, 0 # 取余3
for i in range(n):
if stones[i] % 3 == 0:
cnt0 += 1
elif stones[i] % 3 == 1:
cnt1 += 1
else:
cnt2 += 1
if cnt0 % 2 == 0:
return cnt1 != 0 and cnt2 != 0
return cnt1 > cnt2 + 2 or cnt2 > cnt1 + 2