hdu1536 sg打表
标记数组用bool型防止超时。输入的f[ ]要排序。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 10003 int f[maxn],sg[maxn]; bool vis[maxn]; void getsg(int k) { int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<maxn;i++) { memset(vis,false,sizeof(vis)); for(j=0;f[j]<=i&&j<k;j++) { vis[sg[i-f[j]]]=true; } for(j=0;j<=maxn;j++) { if(!vis[j]) { sg[i]=j; break; } } } } int main() { int k,n,i,j; while(scanf("%d",&k)!=EOF) { if(!k)break; for(i=0;i<k;i++) scanf("%d",&f[i]); sort(f,f+k); getsg(k); scanf("%d",&n); int num=0; while(n--) { int m; scanf("%d",&m); int ans=0; for(j=0;j<m;j++) { int temp; scanf("%d",&temp); ans^=sg[temp]; } if(ans==0) { printf("L"); } else printf("W"); } printf("\n"); } }