最后一步必含首或尾;Alice 胜当且仅当 a1=1 或 an=1。
OJ: codeforces
题目 ID: 2183A
难度:普及-
标签:博弈分类讨论
创建: 2026-07-14 23:50
更新: 2026-10-28 17:33
题意
思路
先看特殊情况:若整段全是
注意到最后一次操作一定覆盖
-
Alice 直接操作。此时 中必有至少一个 (否则就是全 ,上面已处理),所以 ,插入 ,数组变成 。Bob 只能再合并成 ,Alice 胜。 -
对称地,Alice 操作,同样得到 ,Alice 胜。 -
且
Alice 若操作整段,有→ 得 ,立刻输。
因此 Alice 不能同时吃掉和 。操作后序列里至少还剩一个 。
轮到 Bob 时,他对整段操作,得,Bob 胜。
综上:Alice 胜当且仅当
代码
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-07-14 23:50
* update_at: 2026-07-14 23:50
*/
#include <bits/stdc++.h>
using namespace std;
std::vector<int> a;
int T;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
std::cin >> T;
while (T--) {
int n;
std::cin >> n;
a.clear();
for(int i = 1;i <= n ;++i ) // i: 1->n
{
int t;
std::cin >> t;
a.push_back(t);
}
if(a[0] == 1 || a[a.size() - 1])
std::cout << "Alice" << "\n";
else
std::cout << "Bob" << "\n";
}
return 0;
}复杂度
时间
总结
关键观察:最后一手必含首或尾,从而把博弈压成对