0%

Hello 2026——A. Binary Array Game(01 串的首尾很重要,博弈论很少轮次最优)

题目大意

这道题是 Alice 和 Bob 的博弈游戏题。

游戏规则:

  • 两人在一个长度为 n 的数组上进行游戏,数组只包含 0 和 1

  • Alice 先手,双方轮流操作

  • 每次操作选择区间 [l, r],将该区间替换为单个数字 1min(al,...,ar)1 - min(a_l, ..., a_r)

  • 如果区间全是 1,则替换为 0;否则替换为 1

  • 游戏持续到数组只剩一个数字为止

获胜条件:

  • 如果最终剩下的数字是 0,Alice 获胜

  • 否则 Bob 获胜

输入格式:

  • 第一行:测试用例数 t (1 ≤ t ≤ 100)

  • 每个测试用例第一行:数组长度 n (3 ≤ n ≤ 100)

  • 每个测试用例第二行:n 个整数 a_i (0 ≤ a_i ≤ 1)

输出格式:

  • 对于每个测试用例,输出 “Alice” 或 “Bob”(大小写不敏感)

要求: 判断在双方最优策略下谁会获胜

思路讲解

这种题目一般是这样的,看起来这个操作非常复杂,但是实际上是只需要很少轮次的最优操作,就可以得出答案。`

首先,如果整个序列都是11,Alice 就可以通过对整个序列进行操作立即获胜。

注意最后一次操作必须涉及至少一个a1a_1ana_n。我们根据a1a_1ana_n的值进行讨论:

如果a1=1a_1 = 1,那么Alice 可以直接在区间[2,n][2,n]上操作以获胜,因为a2na_{2 \sim n}必须包含至少一个00

如果an=1a_n = 1,那么Alice 可以直接在区间[1,n1][1,n-1]上操作以获胜,因为a1n1a_{1 \sim n-1}必须包含至少一个00

如果a1=0a_1 = 0an=0a_n = 0,那么在整个序列上进行操作肯定会导致Alice 失败。这意味着Alice 不能同时操作a1a_1ana_n。因此,在Alice 操作后,序列aa中仍然至少会有一个00。Bob 然后可以在整个序列上操作以获胜。因此,在这种情况下,Bob 获胜。(这么讲有点奇怪,其实就是,你无论第一次你怎么操作,第二次 Bob 都可以直接掀桌子,得到 1

时间复杂度:O(n)O(\sum n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Solve() {
ll N;
cin >> N;
vector<ll> A(N);
for (int i=0;i<N;++i) {
cin>>A[i];
}
// 全 1 的情况
if (find(all(A),0)==A.end()) {
cout<<"Alice\n";
return;
}
// 只要首尾有一个是 1
if (A.front() || A.back()) {
cout<<"Alice\n";
return;
}
// 首尾都为 0
cout<<"Bob\n";
}

AC代码

AC

https://codeforces.com/contest/2183/submission/358031419

心路历程(WA,TLE,MLE……)