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的倍数的石子那么相当于没有拿,这种情况下我们只要分析其他剩余两种类型的石子cnt1
和cnt2
的个数,假设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
,我们不难看出只要判断cnt1
与cnt2
之间的差值是否大于2