游戏(game.cpp)—CF1747C—1200
\(时间:1s \space |\space 空间:250MB\)
题面翻译
Alice 和 Bob 两个人在玩游戏。
有一个长度为 \(n\) 的序列 \(a\),Alice 和 Bob 两人轮流完成一个操作,Alice 先开始。
每个人可以将数列的第一个数减 \(1\),并将它与后面序列的一个数进行交换,如果一个人操作之前发现当前序列中的第一个数为 \(0\),这个人就输了。
问如果两人都足够聪明,最后谁会赢?
输入格式
本题多测。 第一行包含一个整数 $ t $ $ (1 \leq t \leq 2 \cdot 10^4) $ — 测试数据数量
对于每组数据,第一行包含一个整数 $ n $ $ (2 \leq n \leq 10^5) $ — 表示\(a\)的长度
第二行包含\(n\)个整数 $ a_1,a_2 \ldots a_n $ $ (1 \leq a_i \leq 10^9) $
题目保证所给出的\(n\)之和不超过$ 2 \cdot 10^5 $ .
输出格式
对于每一个测试点,输出获胜玩家姓名,例如"Alice"或"Bob"
对于输出姓名的大小写不做强制要求
样例 #1
样例输入 #1
3
2
1 1
2
2 1
3
5 4 4
样例输出 #1
Bob
Alice
Alice
提示
对于第一个样例,Alice只能选择 $ i = 2 $ , 将序列变为 $ [1, 0] $ . 随后Bob也选择 $ i = 2 $ 并将序列变为 $ [0, 0] $ . 这时, $ a_1 = 0 $ , Alice 输掉了比赛
对于第二个样例,Alice只能选择 $ i = 2 $ . 接着序列的变化如下: $ [2, 1] \to [1, 1] \to [1, 0] \to [0, 0] $ .最终,Bob输掉了比赛
对于第三个样例,可以证明,Alice存在必胜策略
题解
思路
可以发现,每一次,小A只要将序列中的最小值挪到首位,下一轮小B就要把另外一个最大值挪到首位,小A就又可以重复挪动最小值的操作了
所以,只要进入了上述循环,小A必胜,否则小A必败
那么,我们只需要判断是否会进入循环,也就是\(a_1\)是不是\(a\)中的严格最小值(即\(\forall i \in [2,n],满足a_1<a_i\))即可
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=1e5+10;
int n,x,a,flag;
void run()
{
cin>>n>>x;flag=0;
for(int i=1;i<n;i++)
{
cin>>a;
if(a<x) flag=1;
}
cout<<(flag?"Alice":"Bob")<<endl;
return;
}
signed main()
{
int t;
cin>>t;
while(t--) run();
}
标签:10,CF1747C,样例,Codeforces,Alice,leq,Game,序列,Bob
From: https://www.cnblogs.com/lyk2010/p/17857485.html