[Codeforces] CF1747C Swap Game

发布时间 2023-11-26 16:51:12作者: crazy--boy

游戏(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();
 }