【leetcode 每日打卡】2029. 石子游戏 IX

在这里插入图片描述

class Solution:
    def stoneGameIX(self, stones: List[int]) -> bool:
        cnt0 = cnt1 = cnt2 = 0
        for val in stones:
            if (typ := val % 3) == 0:
                cnt0 += 1
            elif typ == 1:
                cnt1 += 1
            else:
                cnt2 += 1
        if cnt0 % 2 == 0:
            return cnt1 >= 1 and cnt2 >= 1
        return cnt1 - cnt2 > 2 or cnt2 - cnt1 > 2

1.首先确定Alice获胜条件,必须使Bob拿到移除总和为3的倍数,也就是移除石子的价值%3==0,所以说Bob从剩下石子中拿出的必定凑成3的倍数那就返回True,其余条件则返回False

2.首先把题目简化一下,将其中出现的数字与3取余,这样可以把数字分为3种类型,cnt0表示取3余0,也就是3的倍数,cnt1表示取3余1,cnt2表示取3余2.

3.石子中cnt0也就是取3余0的石子的个数是偶数那么可以相互抵消,如果两个人拿的都是3的倍数的石子那么相当于没有拿,这种情况下我们只要分析其他剩余两种类型的石子cnt1cnt2的个数,假设Alice先拿的cnt1那么Bob只能拿cnt1,接着就是112121212...,假设Alice先拿cnt2那么Bob只能拿cnt2,接着就是221212121...,所以说Alice决定了Bob拿什么石子,我们可以从上面的循环中找出最小可能,比如112那么Alice拿2Bob必输,221也是同理,其中我们不难看出只要cnt1只要有一个且cnt2也有的话那么Bob必输。

4.另一种情况就是cnt0的石子数如果是奇数的话,首先明确一点,Alice先手不会主动拿0,这样会主动权就给Bob了,Alice拿到最后发现移除1或2无法获胜的话只能拿0,而且0后面如果是2的话那么Alice就获胜,当然这个也是先手Alice决定的,所以说Alice想要获胜只有1110或者2220,我们不难看出只要判断cnt1cnt2之间的差值是否大于2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值