810.黑板异或游戏

思路:这里参考解题区“宫水三叶”小姐姐的解题。
这种“博弈论”的题没做过,再加上是困难题,直奔解题区。
这一题首先要明白如何才能让A取胜:即在A擦去一个数字之前,黑板上的数异或和已经是0了,于是这里就先出现了一种A获胜的情况,就是黑板上所有数字的异或开始就为0(A是先擦数字)。
若一开始异或不为0,想要A获胜,首先A要擦去一个数字,(假设擦去一个数字后黑板上剩余数字的异或为sum),现在轮到B了,要使得B擦去一个数字后必败(选手们都是择对自己最优的解),就要使得剩下数字擦去任意一个后异或结果都为0,假设B擦去一个数字后黑板上的异或结果为sum2,擦去的数字为num[i],我们可以推导出以下式子:
sum!=0
sum2=sum^num[i]=0
对于num[i]来说,我们可取得是sum中任意一个的数字,则式子变换为:
sum⊕num[x]=sum⊕num[x+1]=sum⊕num[x+2]=…=sum⊕num[y]=0(这里num[x]到num[y]是sum中的任意数)
因为x⊕0=x,所以变化式子:
(sum⊕num[x])⊕(sum⊕num[x+1])⊕…⊕(sum⊕num[y])=0
交换律:
(sum⊕sum⊕…⊕sum)⊕(num[x]⊕num[x+1]⊕…⊕num[y])=0
(sum⊕sum⊕…⊕sum)⊕sum=0
因为sum!=0,而都偶数个sum才会异或为0
所以当A擦去一个数之后黑板上的数字个数要为奇数,即游戏开始前黑板上的数字为偶数情况下,A才会必胜。
综上,两种情况下A必胜:1.开始时黑板上的所有数字异或为0;2.黑板上的数字个数为偶数

class Solution {
public:
    bool xorGame(vector<int>& nums) {
        int result(0);
        for(auto& i:nums)
           result^=i;
        return (result==0)||(nums.size()%2==0);
    }
};

官方解答是根据数字奇偶个数来分情况讨论的,这个角度也挺容易理解的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值