Gym101128G:Game of Cards
题意:
有P摞纸牌和一个数字k,每次可以从一摞中拿0-k张牌,拿完再剩下的牌中的第一张数字是几,就必须再拿几张,谁不能拿谁输。
emmm感觉好像就是裸的SG游戏啊,数据不大,递推出每一摞牌的SG值,然后不同摞之间直接异或一下,如果最后结果是0那么先手必输否则先手必胜。
刚好那几天一直在学SG,所以在场上很容易A掉了,得瑟了好久~
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std; 7 const int maxn=1000+10; 8 int p,k; 9 int a[maxn]; 10 int SG[maxn],vis[maxn]; 11 void get_SG(int n){ 12 memset(SG,0,sizeof(SG)); 13 for(int i=1;i<=n;i++){ 14 memset(vis,0,sizeof(vis)); 15 for(int j=0;j<=min(i,k);j++){ 16 if(j==i)continue; 17 int tmp=i-j-a[i-j]; 18 if(tmp>=0) 19 vis[SG[tmp]]=1; 20 } 21 for(int j=0;;j++){ 22 if(!vis[j]){ 23 SG[i]=j; 24 break; 25 } 26 } 27 } 28 return ; 29 } 30 int main(){ 31 scanf("%d%d",&p,&k); 32 int ans=0; 33 for(int i=1;i<=p;i++){ 34 scanf("%d",&a[0]); 35 for(int j=1;j<=a[0];j++) 36 scanf("%d",&a[j]); 37 get_SG(a[0]); 38 ans^=SG[a[0]]; 39 } 40 if(ans) 41 printf("Alice can win."); 42 else 43 printf("Bob will win."); 44 45 return 0; 46 }