解题思路
题目:Alice 和 Bob 在玩游戏,他们面前有 n
堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
① 把石子数为奇数的一堆石子分为两堆正整数个石子
② 把两堆石子数为偶数的石子合并为一堆
Alice 先操作,谁能最后赢得比赛。
假设 n
个数字中,其中有 even
个偶数。
- 将一个奇数
a
分成两个正整数,可以操作a / 2
次,得到a / 2
个偶数和 1 个 1,将操作次数计入cnt
。
此时,已操作cnt
次,且有even + cnt
个偶数,n - even
个 1,1 已不可操作。 - 合并
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; }