如果尝试去刻画这个问题,会发现非常复杂,于是不妨一步一步来。
考虑 Alice 的第一步,此时 Alice 操作的位置是固定的。
考虑把 \(a_n\) 移到一个位置后,接下来的 \(\max\) 是 \(a_{n - 1}\) 或 \(a_n\),Bob 对应也只能这么操作。
注意到 Bob 也有可能操作的是 \(a_n\),这看起来就很特殊。
发现 Bob 把这个 \(a_n\) 无论移到哪了实际上 Alice 都能在第一步就移到这个位置。
刻画一下,相当于是对于决策转移 \(\mathrm{S}\to \mathrm{T}\),满足 \(\forall \mathrm{T}\to \mathrm{P}\) 都有 \(\mathrm{S}\to \mathrm{P}\)。
能够发现 \(\mathrm{S}\) 是必胜的,证明考虑分类讨论:
- \(\forall \mathrm{T}\to \mathrm{P}\),\(\mathrm{P}\) 都必胜,那么 \(\mathrm{T}\) 必输,\(\mathrm{S}\) 就必胜。
- \(\exists \mathrm{T}\to \mathrm{P}\),\(\mathrm{P}\) 必输,那么 \(\mathrm{S}\) 必胜。
于是只要 Alice 能够使第一步后 \(a_n > a_{n - 1}\),即让 Bob 还是操作 \(a_n\),那么 Alice 必赢。
所以说可以知道若 \(a_n - 1 > a_{n - 1}\),Alice 必胜。
否则根据上面的决策的讨论,可以知道为了不让对方赢,肯定每一步都会让最大的两个值相邻。
那么每次决策后 \(\max\{a_i\}\) 必定会 \(-1\)(最大的往下,次大的为最大的 \(-1\),变为新的最大的)。
那么到最后 \(\max\{a_i\} = n - 1\) 时就无法再操作了,操作轮数 \(\max\{a_i\} - (n - 1)\),如果为奇数那么 Alice 就肯定赢了。
时间复杂度 \(\mathcal{O}(n)\)。
#include<bits/stdc++.h>
const int maxn = 3e5 + 10;
int main() {
int n, x, y;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
x = y, scanf("%d", &y);
}
puts((x + 1 < y || (y - (n - 1)) % 2 == 1) ? "Alice" : "Bob");
return 0;
}
标签:Atcoder,Distinct,Solution,Alice,必胜,int,Bob,mathrm
From: https://www.cnblogs.com/rizynvu/p/18521032