石子游戏。博弈论
分类讨论
① 当偶数的个数不为0
此时对奇数进行操作是不影响结果的。
证明:因为每次都会分出一个奇数/偶数,既然能分出偶数,
那就存在>=2个偶数,对手将新分出的偶数合并,就又回到了初始状态。
此时判断偶数个数的奇偶性即可
② 当偶数的个数为0
存在能被分割的奇数,先手必胜。
证明:先手先分出一个偶数,后手只能分割奇数,先手必能够操作(将新分出来的偶数合并)
当奇数被分割完毕,后手就没法操作,先手胜。
C++ Code
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, even = 0, odd = 0;
cin >> n;
for (int i = 1, x; i <= n; i++) {
cin >> x;
if (x&1) {
if (x >= 3) odd = 1; // 能被分割
}
else even++;
}
if (even > 0) {
if (even&1) cout << "Bob\n";
else cout << "Alice\n";
}
else {
if (odd) cout << "Alice\n";
else cout << "Bob\n";
}
return 0;
}