void solve() { int n; cin >> n; int odd = 0, even = 0; for (int i = 0; i < n; i++) { int a; cin >> a; if (a & 1) odd++; else even++; } int t = odd & 3; if (!t || (t == 1 && (even & 1)) || t == 3) { cout << "Alice\n"; } else cout << "Bob\n"; }
C. Even Number Addicts
题意:有n个数,Alice和Bob进行博弈,每个人每一轮从中选择一个数,并删除,Alice先手。如果Alice拿到的数之和为偶数那么Alice赢,否则Bob赢。两人都取最优解,问谁能赢得游戏。(n<=100)
题解:由于n只有100,可以二维dp直接过。不过有更好的贪心方法。
假设奇数的个数为x,偶数的个数为y
-
如果x≡0 mod4 Alice必胜。因为如果y为偶数,则Alice可以先取奇数,然后当Bob取奇数的时候,Alice再取奇数,这样保证Alice刚好能拿到一半的奇数。如果y为奇数,则Alice先拿偶数。同样可以保证Alice刚好能拿到一半的奇数。
-
x≡1 mod4
- 如果y为奇数,则Alice必胜。因为Alice总可以让Bob取奇数时再取奇数,所以取得的奇数个数为偶数。
- 如果y为偶数,则Alice必败。因为Bob可以跟着Alice拿,Alice一定拿到奇数个奇数
-
x≡2 mod4 Alice必败。当y为奇数时,如果Alice取奇数,则Bob取一个偶数,转化为上一种情况种的第二种子情形。当y为偶数时,Bob跟着Alice取即可。这样一定保证Alice只能取奇数个奇数。
-
x≡3mod4 Alice必胜。Alice可以先拿走一个奇数。对于Bob来说,转化为上一种情况,此时Bob必败,说明Alice必胜