This way
题意:
第一个人有一个数x,第二个人有一个数x+3。给你长度为n的数组a,他们俩从左到右依次遍历a[i],并且每次可以选择两个操作中的一个:
1.手上的数+=a[i]
2.手上的数^=a[i]
最终要使得手上的数=y,并且有且仅有一个人能够做到,问你这个人是谁。
题解:
一开始看到完全无从下手,首先我对于博弈本来就菜的一批,换成搜索或者dp感觉有点超出这道题的难度了,而且一下子也不知道怎么办。
此时这个+3吸引了我的注意,+3意味着这俩人不同奇偶,并且1和2操作无论怎么做都会改变手上值的奇偶性,于是解题思路就出来了:
如果x^a[1]^a[2]^…^a[n]^y是偶数的话,那么就是Alice,否则是Bob。
也就是说我们根本不需要去求出具体的过程,很多题目都不需要自己自作多情将一些不需要的因素考虑进去。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll n,x,y,a;
int f=0;
scanf("%lld%lld%lld",&n,&x,&y);
for(int i=1;i<=n;i++)scanf("%lld",&a),f^=a%2;
int odd=(x%2)^(y%2);
if(odd==f)printf("Alice\n");
else printf("Bob\n");
}
return 0;
}