题意:
有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,
也可以选择将这堆石子分成任意的两堆。alice与bob轮流取,取走最后一个石子的人胜利。
思路:
因为数的范围比较大,所以最好通过SG打表的结果找出规律在解。
打表代码
#include<cstdio> #include<cstring> int sg[10000]; int find(int x) { if(sg[x]>=0) return sg[x]; bool mex[10000]= {0}; for(int i=0; i<x; i++) { mex[find(i)]=1;// if(x-i>0&&i>0) mex[find(i)^find(x-i)]=1; } int i=0; while(mex[i]) i++; return sg[x]=i; } int main() { int n; memset(sg,-1,sizeof(sg));//sg[0]=0; //printf("%d#",sg[0]); find(100); for(int i=0; i<=100; i++) printf("%d %d ",i,sg[i]); return 0; }
提交代码:
#include<stdio.h> int x[4]={-1,0,0,1}; int main() { int _case,n,m,ans; scanf("%d",&_case); while(_case--) { ans=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&m); ans^=m+x[m%4]; } if(ans)printf("Alice "); else printf("Bob "); } }
: