HDU 1536/1944 求SG值(走法不任意)
来源:互联网 发布:ai编程语言 编辑:程序博客网 时间:2024/06/02 15:16
#include<stdio.h> #include<string.h> #include<stdlib.h> int s[101]; int sg[10001]; int g(int temp , int k) { int mex[101],i; memset(mex,0,sizeof(mex)); if(sg[temp]!=-1) return sg[temp]; //集合S一致,则每个数量的mex一样,所以可以重复利用 if(temp-s[0]<0) return sg[temp]=0; //s[0]为集合中最小值,temp-s[0]<0,则temp不可能到达其他状态,一定为P for(i=0;i<k && temp-s[i]>=0;i++) //判断条件,因为s[]排了序,当temp-s[i]<0就停止循环。 { mex[g(temp-s[i] , k)]=1; //temp的后继SG函数中的没有出现的最小非负数 } for(i=0;;i++) //通过temp的后继SG函数出现的非负数得temp的结果 if(!mex[i]) return sg[temp]=i; } int comp(const void *a,const void *b){return *(int *)a-*(int *)b;} int main() { int k,i ; int n, t ,temp, ans; //freopen("in.txt","r",stdin); while(scanf("%d",&k)!=EOF && k) { memset(sg,-1,sizeof(sg)); sg[0]=0; for(i=0;i<k;i++) scanf("%d",&s[i]); qsort(s,k,sizeof(int),comp); scanf("%d",&t); while(t--) { ans=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&temp); ans^=g(temp , k); } if(!ans) printf("L"); //异或sum!=0,说明该点为必败点,只能到达必胜点。 else printf("W"); } printf("\n"); } return 0; }