leetcode 2029. 石子游戏 IX【贪心】

在这里插入图片描述
题意:采用最佳决策,尽量使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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值