解题思路

题目:Alice 和 Bob 在玩游戏,他们面前有 n 堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
① 把石子数为奇数的一堆石子分为两堆正整数个石子
② 把两堆石子数为偶数的石子合并为一堆
Alice 先操作,谁能最后赢得比赛。

假设 n 个数字中,其中有 even 个偶数。

  1. 将一个奇数 a 分成两个正整数,可以操作 a / 2 次,得到 a / 2 个偶数和 1 个 1,将操作次数计入 cnt
    此时,已操作 cnt 次,且有 even + cnt 个偶数,n - even 个 1,1 已不可操作。
  2. 合并 even + cnt 个偶数,可以操作 even + cnt - 1 次,计入 cnt

C++代码

#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;

    int a;
    int even = 0;
    int cnt = 0;
    for(int i=0; i<n; ++i){
        cin >> a;
        if(a % 2 == 0)
            ++even;
        else
            cnt += a / 2;
    }
    cnt += even + cnt - 1;
    if(cnt % 2 == 1){
        cout << "Alice" << endl;
    }
    else{
        cout << "Bob" << endl;
    }
    return 0;
}