本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
【CCPC】2022广州站 H. GameX | 博弈论
题目链接
题目
题目大意
Alice 和 Bob 玩游戏。游戏是关于 MEX 操作的,因此被命名为 GameX。
为了帮助你理解游戏,我们首先给出了 MEX 的定义。给定一组整数S,将 定义为不在 中的最小自然数。换句话说,。
游戏进行如下。在游戏开始之前,。
两人交替操作,Alice 是先手。在移动过程中,他/她可以选择任意整数 ,并将 插入 中。因此 更新为 。
在 回合之后,每个玩家都进行了 次更新,现在是决定胜者的时候了。如果 为偶数,Alice 获胜,否则 Bob 获胜。
他们都绝对聪明,请对于给定的初始集合 和 游戏轮数 请输出最后赢得游戏的人是谁。多组数据。
思路
显然 Alice 的最优策略是不停插入最小的不在 中的非负奇数,Bob 的最优策略是不停插入最小的不在 中的非负偶数。模拟填数判断答案即可。
代码
#include <stdio.h>
#include <algorithm>
#include <queue>
#define lowbit(x) (x&-x)
using namespace std;
using LL=long long;
const int N=500005;
int n,m,a[N];
int solve()
{
scanf("%d%d",&n,&m);
int flag=0;
for (int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if (a[i]==0) flag=1;
}
int A=m,B=m;
if (!flag)
{
a[++n]=0;
B--;
}
sort(a+1,a+1+n);
a[++n]=1e6+1;
for (int da,db,i=2;i<=n;++i)
{
da=db=(a[i]-a[i-1]-1)/2;
if ((a[i]-a[i-1]-1)%2)
{
if (a[i]%2) db++;
else da++;
}
if (A>=da)
if (B>=db) A-=da,B-=db;
else return 1;
else if (B>=db) return 0;
else
{
if ((a[i-1]%2&&A>=B)||(a[i-1]%2==0&&A>B)) return 1;
else return 0;
}
}
}
int main()
{
int T;
for (scanf("%d",&T);T--;)
if (solve()) printf("Alice\n");
else printf("Bob\n");
return 0;
}