2029.石子游戏 IX

664 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

2029.石子游戏 IX

题目大意

Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。

Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。

  • 如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏
  • 如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。

假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false

样例

img

数据规模

img

思路

根据题意,因为考虑stone[i]\sum{stone[i]}是否是3的倍数,所以可以将stone[i]%=3stone[i]\%=3,那么stone[i][0,2]stone[i]∈[0,2]。设t1,t2,t0t1,t2,t0分别表示stone[i]=1,2,0stone[i]=1,2,0的数量。

如果t0为偶数t0为偶数

那么t0t0将不对结果产生影响,原因:一方选择stone[i]=0stone[i]=0,另一方可以同样选择stone[i]=0stone[i]=0,最后执行2k2k次,stone[i]=0stone[i]=0被消耗完,但Alice和Bob的顺序不发生改变。所以这种情况下可以忽略stone[i]=0stone[i]=0的石子,只考虑t1t1t2t2

Alice和Bob的顺序是如何的呢?

  • Alice先手选择1,那么Bob必须选择1,然后Alice必须选择2,那么最终顺序就是112121212...112121212...
  • Alice先手选择2,那么Bob必须选择2,然后Alice必须选择1,那么最终顺序就是221212121...221212121...

那么Alice就选择一个数量少的作为先手,然后交替之后Alice就会一直选择数量多的,而Bob只能选择数量少的,这样Alice是必胜。注意必须保证t1>=1&&t2>=1t1>=1\&\&t2>=1

如果t0为奇数t0为奇数

那么胜负情况等价于只有1个stone[i]=0stone[i]=0的石子组合类型的胜负情况。注意这里不能等价于[没有stone[i]=0stone[i]=0的石子组合类型的胜负情况]的相反情况,这是因为如果所有的石子都被移除完,无论谁移除了最后一个石子,都算 Alice 输。因此如果 Alice 发现自己选择stone[i]=1或者stone[i]=2stone[i]=1或者stone[i]=2的石子不能获胜,于是选择移除类型0的石子,并且它不能获胜的原因是[石子会移除完],那么 Alice 仍然会输。

所以Alice会选择数量最多的作为先手,然后交替之后Alice就会一直选择数量少的,而Bob只能选择数量少的,但是Alice会选择一个stone[i]=0stone[i]=0来扭转局面,实现必胜。注意必须保证数量多的-数量少的>=2

代码

class Solution {
public:
    bool stoneGameIX(vector<int>& stones) {
        int t1=0,t2=0,t0=0;
        for(int i=0;i<stones.size();i++){
            stones[i]=stones[i]%3;
            t1+=(stones[i]==1);
            t2+=(stones[i]==2);
            t0+=(stones[i]==0);
        }
        if(t0%2==0){
            return t1>=1&&t2>=1;
        }
        return t1-t2>2||t2-t1>2;
    }
};