Codeforces Global Round 22 C. Even Number Addicts(博弈论)
https://codeforces.com/contest/1738/problem/C
题目大意:
给定n个数字,Alice先手,Bob后手;
拿完之后,Alice数字总和为奇数时Alice获胜,否则Bob获胜。
问我们给定n个数字,双方都足够聪明的情况下,谁会获胜?
input
4
3
1 3 5
4
1 3 5 7
4
1 2 3 4
4
10 20 30 40
output
Alice
Alice
Bob
Alice
-
我们可以想到,Alice作为先手,如果她想要获胜的话,偶数的个数对于她来说其实意义不大,重要的就是奇数个数
-
当只有1个奇数的时候,只要后面偶数个数是奇数的话,就可以把这一个奇数剩给Bob,这样就是Alice必赢;
否则偶数个数是偶数个的时候,这前面的这个奇数就成了Alice的了,Bob必赢; -
当有两个奇数的时候,无论Alice是先拿奇数还是先拿偶数都会Bob都可以让Alice拿下一个奇数,Bob必赢;
-
当只有三个奇数的时候,Alice先拿两个奇数,直接Aice必赢;
-
当有四个奇数的时候,Alice先拿两个,也是Alice必赢;
-
当有>=五个奇数的时候,我们可以发现和前四种情况是一样的,所以可以采取%4操作
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=2000020;
const int N=200200,M=2002;
int main()
{
cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL ji=0,ou=0;
for(int i=1;i<=n;i++)
{
LL x;
cin>>x;
if(x%2) ji++;
else ou++;
}
if(ji%4==2) cout<<"Bob"<<endl;
else if(ji%4==3||ji%4==0) cout<<"Alice"<<endl;
else if(ji%4==1)
{
if(ou%2) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
}
return 0;
}