Codeforces Global Round 22 C
思路:
因为获胜条件只需要是偶数就行,因此,这个数只需要判断其奇偶性对答案的贡献就行。剩下的,可以直接利用深搜的即可(数据范围不大)。
void Solution() {
int n;
cin >> n;
vector<int> cnt(2);
for (int i = 0; i < n; i ++) {
int x;
cin >> x;
cnt[x & 1] ++;
}
// f[who][res][cnt of one][cnt of zero]
// who := 0 A else 1 B
// res := Alice's res
// o := one's cnt; z := zero's cnt
vector f(2, vector(2, vector(n + 1, vector(n + 1, -1))));
function<bool(int,int,int,int)> dfs = [&](int who, int res, int o, int z) -> bool {
if (o + z == 0) {
return who ? res : !res;
} else if (~f[who][res][o][z]) {
return f[who][res][o][z];
}
if (
(z > 0 && !dfs(who ^ 1, res, o, z - 1))
) {
return f[who][res][o][z] = 1;
}
if (o > 0) {
if (who == 0) {
if (!dfs(who ^ 1, res ^ 1, o - 1, z)) {
return f[who][res][o][z] = 1;
}
} else {
if (!dfs(who ^ 1, res, o - 1, z)) {
return f[who][res][o][z] = 1;
}
}
}
return f[who][res][o][z] = 0;
};
if (dfs(0, 0, cnt[1], cnt[0])) {
cout << "Alice" << '\n';
} else {
cout << "Bob" << '\n';
}
}