【CCPC】2022广州站 H. GameX | 博弈论

198 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

【CCPC】2022广州站 H. GameX | 博弈论

题目链接

Problem - H - Codeforces

题目

image.png

题目大意

Alice 和 Bob 玩游戏。游戏是关于 MEX 操作的,因此被命名为 GameX。

为了帮助你理解游戏,我们首先给出了 MEX 的定义。给定一组整数S,将 MEX(S)MEX(S) 定义为不在 SS 中的最小自然数。换句话说,MEXS=minxNxxSMEX(S)=min{x∈N∣x(x)∉S}

游戏进行如下。在游戏开始之前,S=a,a2,,anS={a_,a_2,⋯,a_n}

两人交替操作,Alice 是先手。在移动过程中,他/她可以选择任意整数 xx,并将 xx 插入 SS 中。因此 SS 更新为 SxS∪{x}

kk 回合之后,每个玩家都进行了 kk 次更新,现在是决定胜者的时候了。如果 MEX(S)MEX(S) 为偶数,Alice 获胜,否则 Bob 获胜。

他们都绝对聪明,请对于给定的初始集合 SS 和 游戏轮数 kk 请输出最后赢得游戏的人是谁。多组数据。

思路

显然 Alice 的最优策略是不停插入最小的不在 SS 中的非负奇数,Bob 的最优策略是不停插入最小的不在 SS 中的非负偶数。模拟填数判断答案即可。

代码

#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;
}