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;
}
posted @ 2022-10-03 13:36  Vijurria  阅读(79)  评论(0编辑  收藏  举报