810. 黑板异或游戏

810. 黑板异或游戏

数学时刻提醒我们:保持谦逊!

我的思路

  • 想了半天,完全没思路。但是我知道,这题一定代码简单,因为一定存在先手必胜的条件。

博弈的整体思路

  1. 经验:奇偶性
  2. 推导先手必胜条件,或者后手必败条件。

数学之美

Reference :

Alice 和 Bob 都是聪明的人。

下面,分析 Alice 必胜的条件。

  1. 当初始数组 n u m s nums nums 中的所有数字的异或和为 0 时,Alice 必胜。即:
    n u m s [ 0 ] ⊕ n u m s [ 1 ] ⊕ … ⊕ n u m s [ n − 2 ] ⊕ n u m s [ n − 1 ] = 0 nums[0] \oplus nums[1] \oplus \ldots \oplus nums[n-2] \oplus nums[n-1]= 0 nums[0]nums[1]nums[n2]nums[n1]=0 不妨记 n u m s [ 0 ] ⊕ n u m s [ 1 ] ⊕ … ⊕ n u m s [ n − 2 ] ⊕ n u m s [ n − 1 ] nums[0] \oplus nums[1] \oplus \ldots \oplus nums[n-2] \oplus nums[n-1] nums[0]nums[1]nums[n2]nums[n1] S S S.

  2. S ≠ 0 S \ne 0 S=0 时,Alice 必胜的条件是:Alice 先去掉一个数字(记为 n u m s [ k 0 ] nums[k_0] nums[k0]),此时的数组异或和记为 S ′ S' S,然后 Bob 去除任意一个数字( n u m s [ k ] nums[k] nums[k])后,记此时数组异或和为 S ′ ′ S'' S,必然有 S ′ ′ = 0 S''=0 S=0.

    • Bob是个聪明的人,如果 Bob 发现去除某一个数字可以让 S ′ ′ ≠ 0 S''\ne0 S=0,那么他一定会去除这个数字,因为他不想输。
    • 因此,Bob去除的数字必须是任意的,然后 Bob 必输,Alice 才能必胜。
    • 根据上述分析,有: S = n u m s [ 0 ] ⊕ n u m s [ 1 ] ⊕ … ⊕ n u m s [ n − 2 ] ⊕ n u m s [ n − 1 ] S ′ = n u m s [ 0 ] ⊕ … ⊕ n u m s [ k 0 − 1 ] ⊕ n u m s [ k 0 + 1 ] … ⊕ n u m s [ n − 1 ] S ′ ′ = n u m s [ 0 ] ⊕ … ⊕ n u m s [ k 0 − 1 ] ⊕ n u m s [ k 0 + 1 ] ⊕ … ⊕ n u m s [ k − 1 ] ⊕ n u m s [ k + 1 ] … ⊕ n u m s [ n − 1 ] S=nums[0] \oplus nums[1] \oplus \ldots \oplus nums[n-2] \oplus nums[n-1]\\S'=nums[0] \oplus \ldots \oplus nums[k_0-1]\oplus nums[k_0+1] \ldots\oplus nums[n-1]\\ S''=nums[0] \oplus \ldots \oplus nums[k_0-1]\oplus nums[k_0+1] \oplus\ldots\\ \oplus nums[k-1]\oplus nums[k+1] \ldots \oplus nums[n-1] S=nums[0]nums[1]nums[n2]nums[n1]S=nums[0]nums[k01]nums[k0+1]nums[n1]S=nums[0]nums[k01]nums[k0+1]nums[k1]nums[k+1]nums[n1] S = S ′ ⊕ n u m s [ k 0 ] S ′ = S ′ ′ ⊕ n u m s [ k ] S=S'\oplus nums[k_0]\\S'=S''\oplus nums[k] S=Snums[k0]S=Snums[k]即, S ′ ′ = S ′ ⊕ n u m s [ k ] 0 ≤ k ≤ n − 1 , k ≠ k 0 S''=S'\oplus nums[k] \\ 0 \le k \le n-1, k\ne k_0 S=Snums[k]0kn1,k=k0
    • 也就是说,因为 k k k 的任意性,Alice 必胜时, S ′ ′ = 0 S''=0 S=0 恒成立,有:
      S ′ ⊕ n u m s [ 0 ] = 0 … S ′ ⊕ n u m s [ k 0 − 1 ] = 0 S ′ ⊕ n u m s [ k 0 + 1 ] = 0 … S ′ ⊕ n u m s [ n − 1 ] = 0 S'\oplus nums[0] = 0\\\ldots\\S'\oplus nums[k_0-1]=0\\S'\oplus nums[k_0+1]=0\\ \ldots \\S'\oplus nums[n-1]=0 Snums[0]=0Snums[k01]=0Snums[k0+1]=0Snums[n1]=0
      • 上述共 n − 1 n-1 n1 个式子( n n n n u m s nums nums 的长度)。
    • 将上述 n − 1 n-1 n1 个式子异或: ( S ′ ⊕ n u m s [ 0 ] ) ⊕ … ⊕ ( S ′ ⊕ n u m s [ k 0 − 1 ] ) ⊕ ( S ′ ⊕ n u m s [ k 0 + 1 ] ) ⊕ … ⊕ ( S ′ ⊕ n u m s [ n − 1 ] ) = 0 (S'\oplus nums[0]) \oplus \ldots \oplus(S'\oplus nums[k_0-1])\oplus\\(S'\oplus nums[k_0+1])\oplus \ldots \oplus(S'\oplus nums[n-1])=0 (Snums[0])(Snums[k01])(Snums[k0+1])(Snums[n1])=0
    • 整理得: ( S ′ ⊕ … ⊕ S ′ ) ⊕ ( n u m s [ 0 ] ⊕ … ⊕ n u m s [ k 0 − 1 ] ⊕ n u m s [ k 0 + 1 ] … ⊕ n u m s [ n − 1 ] ) = 0 (S'\oplus\ldots\oplus S')\oplus \\(nums[0] \oplus \ldots \oplus nums[k_0-1]\oplus nums[k_0+1] \ldots\oplus nums[n-1]) = 0 (SS)(nums[0]nums[k01]nums[k0+1]nums[n1])=0
      即, ( S ′ ⊕ … ⊕ S ′ ) ⏟ n − 1 个 ⊕ ( S ′ ) = 0 \underbrace{(S'\oplus\ldots\oplus S')}_{n-1个} \oplus (S')=0 n1 (SS)(S)=0
      即, ( S ′ ⊕ … ⊕ S ′ ) ⏟ n 个 = 0 \underbrace{(S'\oplus\ldots\oplus S')}_{n个}=0 n (SS)=0
    • S ′ ′ = 0 S''=0 S=0 恒成立的条件是 n 个 S ′ ′ S'' S异或的结果为 0 ,显然,当 n n n 是偶数时,恒成立,即, n n n 是偶数时,Alice 必胜。

综上,Alice 必胜的条件(满足其中之一即可)是:

  1. S = 0 S = 0 S=0
  2. n n n 是偶数

根据上述分析可以写出AC代码:

class Solution {
public:
    bool xorGame(vector<int>& nums) {
        int n = nums.size();
        if (!(n & 1)){
            return true;
        }
        int S = 0;
        for (auto item : nums){
            S ^= item;
        }
        return S == 0;
    }
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),一层for。
  • 空间复杂度: O ( 1 ) O(1) O(1),使用了可数个变量。

2021.05.22 21:16


今天,中华拓荒人——袁隆平逝世了。

稻浆小满先生汗,谷库丰隆国士心。
诸君勿忘贫苦日,吾辈永志挖水人!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值