某考试T1 game

题目背景

题目描述

Alice 和 Bob 在一个圆环上玩游戏。圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n。Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n?1] 内的正整数。游戏开始时会有一个棋子摆在圆环上的某个位置,然后两人轮流 行动。轮到某个人的回合时,他可以从他的集合中选出某个数 x,然后把棋子 沿顺时针方向移动 x 个位置。如果某个人把棋子移动到了 1 号位置,那么他就 获胜了。两个人都会以最优策略行动。 你需要对不同先后手顺序以及棋子初始位置的每种情况,求出谁能获胜, 或者说游戏永远不会结束。

输入输出格式

输入格式:

第一行为一个正整数 n。 第二行的第一个正整数 k1 表示 Alice 的集合的大小,接下来的 k1 个正整 数表示 Alice 的集合中的数(保证这些数不会重复)。 第三行的第一个正整数 k2 表示 Bob 的集合的大小,接下来的 k2 个正整 数表示 Bob 的集合中的数(保证这些数不会重复)。

输出格式:

第一行输出 n ? 1 个词,第 i 个词表示 Alice 先手且棋子初始在位置 i + 1 的答案。如果 Alice 必胜输出”Win”,必败输出”Lose”,游戏不会结束输 出”Loop”。 第二行输出 n?1 个词,第 i 个词表示 Bob 先手且棋子初始在位置 i+ 1 的 答案。如果 Bob 必胜输出”Win”,必败输出”Lose”,游戏不会结束输出”Loop”。

输入输出样例

输入样例#1:

5
3 3 1 2
2 2 3

输出样例#1:

Loop Win Win Win
Lose Win Win Loop

说明

对于 30% 的数据,保证 2 ≤ n ≤ 5。 对于 60% 的数据,保证 2 ≤ n ≤ 300。 对于 100% 的数据,保证 2 ≤ n ≤ 7000, 1 ≤ k1, k2 ≤ n ? 1。

就是一个最简单的博弈问题,图都不用建一遍dfs就行了。。。

然而我考试的时候忘了标记已经计算过的节点然后才50。。。。。我好菜啊ww

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define maxn 7005
using namespace std;
int n,s,t,a[maxn],b[maxn];
int win[maxn*2];
int cnt[maxn*2];
bool vis[maxn*2];

inline int add(int x,int y){
	x+=y;
	if(x>=n) return x-n;
	else return x;
}

inline void bfs(){
	queue<int> q;
	int x,to;
	q.push(0),q.push(n);
	win[0]=win[n]=-1;

	while(!q.empty()){
		x=q.front(),q.pop();
		vis[x]=1;

		if(x<n){
			for(int i=1;i<=t;i++){
				to=add(x,n-b[i])+n;
				if(vis[to]) continue;

				if(win[x]==-1) win[to]=1,q.push(to);
				else if(win[x]==1&&(++cnt[to])==t) win[to]=-1,q.push(to);
			}
		}
		else{
			for(int i=1;i<=s;i++){
				to=add(x,-a[i]);
				if(vis[to]) continue;

				if(win[x]==-1) win[to]=1,q.push(to);
				else if(win[x]==1&&(++cnt[to])==s) win[to]=-1,q.push(to);
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	scanf("%d",&s);
	for(int i=1;i<=s;i++) scanf("%d",a+i);
	scanf("%d",&t);
	for(int i=1;i<=t;i++) scanf("%d",b+i);

	bfs();

	for(int i=1;i<n;i++){
		if(!win[i]) printf("Loop ");
		else if(win[i]==1) printf("Win ");
		else printf("Lose ");
	}
	puts("");
	for(int i=1;i<n;i++){
		if(!win[i+n]) printf("Loop ");
		else if(win[i+n]==1) printf("Win ");
		else printf("Lose ");
	}	

	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8480486.html

时间: 2024-08-30 18:27:09

某考试T1 game的相关文章

16.1112 模拟考试 T1

加密[问题描述]有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符. 相应的,不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符.给定原文s和加密后的字符串t,求?有多少子串可以通过解密得到原文s.[输入格式]输入第一行包含一个字符串t,第二行包含一个字符串s.[输出格式]输出一行,包含一个整数,代表可以通过解密得到原文的s的子串的数量.[样例输入]abcabcabccba[样例输出]9[样例解释]用[?,?]表示子串开头结尾的下标(从 0 开始编号) ,这 9 种方案是:[0

某考试 T1 sigfib

设 g(x) = f(x) * x ,多项式 A = Σ g(i) * x^i , 多项式  B = Σ f(i) * x^i. 首先,g(x) = g(x-1) + g(x-2) + f(x-1) + 2f(x-2),所以我们可以得到: A = x * A + x^2 * A + x * B + 2 * x^2 * B + x 又因为B是斐波那契数列的多项式,所以B的闭形式可以直接得到,就是  x/(1-x-x^2)   [这个也不难推,可以自己推推]. 于是我们可以开开心心的解出A的闭形式,

某考试 T1 Hello my friend

Discription 原文地址:https://www.cnblogs.com/JYYHH/p/8870108.html

某考试 T1 fair (18.5.1版)

转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2^n  [请在二维平面直角坐标系上自行演算,(x,y)可以到 (x+1,y)和(x,y+1),横坐标代表1的个数,纵坐标代表0的个数,求不经过 y=x+1 这条直线的路径总数  (重点是 任意 (x,y) 满足 x+y==n 且 x>=y)] 本来以为卡卡常数就过去了23333,没想到竟然还要用 阶乘逼

某考试 T1 lcm

把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b)的所有约数找出来,然后看a要有某个约数的话n至少是多少,更新答案即可.(因为1e9以下的数的最多的约数的级别是1e3) #include<iostream> #include<cstdio> #include<algorithm> #include<cmath>

2020.3.1考试T1 多项式

出题人很凉心的把算法写成了题目名 首先我们可以发现每一维的贡献是独立的,这可以从 \(solve1\) 里看出来 然后我们可以考虑转化为 \(DP\) ,这可以从 \(solve2\) 里看出来 我们统计每一维能产生的贡献,就是 \(a\) 个 \(0\) 面, \(b\) 个 \(1\) 面, \(c\) 个 \(2\) 面这种形式,能写成一个多项式 \(ax^0+bx^1+cx^2\),而我们最终显然就是把所有的多项式都乘起来. 暴力一个一个乘就很 naive,分治 \(NTT\) 解决就好

好多考试....

11.01 早上考试 T1 虎... 这题真是虎,大力才结论,水掉了... 每一次翻转一定是只翻转白色连续的一段,然后dfs一遍就行了 #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> #define ll long long #define mem(a,b) memset(a,b,sizeof(a))

BZOJ 1711: [Usaco2007 Open]Dining吃饭

1711: [Usaco2007 Open]Dining吃饭 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 902  Solved: 476[Submit][Status][Discuss] Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做了F (1 <= F <= 100) 种食品

暑假集训D17总结

考试 玄学的一次考试= = T1乱搞 只会乱搞出前二十分  然后真的拿了二十分 T2模拟 自己造数据 没有一个是在十分钟内跳出来的 然后竟然A了 T3暴力 觉得如果老爷机心情不好就会被卡到20  然后竟然时限太大拿了40 全是玄学= = 看成绩先按了一下$End$,然后莫名翻回了顶部 内部题,就不写题解了 刷题 随便刷吧 话说1A竟然被怀疑,我要是不练1A能力我还考啥试= = 然后在邻接表数组大小上被坑了两次 心累啊 然后考试A掉的T2,竟然在HZOJ上T了WTF,原因是TL开小了,然后开大到4