题目描述:
Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
1. 把石子数为奇数的一堆石子分为两堆正整数个石子
2. 把两堆石子数为偶数的石子合并为一堆
两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。
思路:我们考虑游戏的终止状态就是只有一堆偶数或者1加上一堆偶数。我们考虑首先考虑对奇数堆的操作:1,操作一次将奇数堆分成1和1个偶数z 2.将奇数分成(1+x)和y,再将(1+x)分为1和x,最后将x和y合并为z。我们发现第一次操作用来1次,第二种操作用了3次。其实我们发现无论怎样分奇数堆操作次数的奇偶性与直接按照第一种方式分是相同的。所以我们可以将所有的奇数按照第一种方式分,然后将剩余的偶数合并,根据操作次数的奇偶性来判断胜负。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,even=0,odd=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(x%2==0)even++;
if(x%2==1&&x!=1) odd++;//1需要特判
}
if((2*odd+even-1)%2==1)cout<<"Alice";
else cout<<"Bob";
}