DXS和LCH在玩一个纸牌游戏,他们找来很多纸牌,每张牌上写有1到10其中的某一个数字,将牌面(有数字的一面)向上,摞成几堆。
他们两个轮流操作,每次操作分为三步:
1、选择一个牌堆。
2、从该堆由上向下依次拿走最少为0,最多为k的卡牌,但是要至少留下一张牌。
3、玩家查看当前牌堆顶的牌面数字,是多少就必须再从这堆牌由上至下拿走多少,如果牌不够拿了,这次操作就是不能执行的。
DXS发现LCH似乎很擅长这类游戏,他只要抓住机会就能获胜。好在LCH发扬风格,每次都让DXS先拿,但是DXS并没有找到这个游戏的窍门,于是他找到了你,想让你帮他看看这局他有没有可能获胜。
Input
每组数据的第一行包含两个数字n和k,接下来有n行,代表n个牌堆的状态,k的定义与题意相同。
每一行第一个数字是m,代表这堆牌有m张,接下来有m个数字,依次是从牌堆底到牌堆顶的所有牌面的数字。
1<=n<=100,1<=k<=10,1<=m<=1000。
Output
如果DXS能找到一种方法获胜,则输出“DXS is winner”,
如果这局DXS无法获胜,则输出“LCH is a cheater”。输出不包括引号。
Sample Input
2 1
6 2 1 2 1 2 1
6 2 1 2 1 2 1
2 1
1 1
3 1 2 1
4 3
10 3 5 6 9 8 7 4 2 1 1
8 1 1 1 1 3 2 2 2
9 2 2 2 3 3 3 2 2 2
5 1 2 3 2 1
Sample Output
LCH is a cheater
DXS is winner
DXS is winner
SG函数板题
#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxn=10050;
int a[maxn];
int isok[maxn];
int vis[maxn];
int main()
{
int n,k;
while(~scanf("%d %d",&n,&k))
{
int flag=0;
for(int i=1;i<=n;i++)
{
int l;
scanf("%d",&l);
for(int i=1;i<=l;i++)
scanf("%d",&a[i]);
isok[0]=0;
for(int i=1;i<=l;i++)
{
memset(vis,0,sizeof vis);
for(int j=0;j<=k;j++)
{
if(i>j)
{
if((i-j)>=a[i-j])
vis[isok[i-j-a[i-j]]]=1;
}
}
int j=0;
while(vis[j]) j++;
isok[i]=j;
}
flag=flag^isok[l];
// cout<<endl;
}
if(!flag)
{
cout<<"LCH is a cheater"<<endl;
}
else
{
cout<<"DXS is winner"<<endl;
}
}
}