题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536
只要构造好SG函数就行:AC代码:
#include<iostream> using namespace std; #include<string.h> int a[110],k; //k为全局变量 int sg[10010],flag[110]; void SG() //SG函数 { int i,j; for(i=0;i<=10000;i++) { memset(flag,0,sizeof(flag)); for(j=0;j<k;j++) if(i>=a[j]) flag[sg[i-a[j]]]=1; for(j=0;;j++) //采用筛选法 if(flag[j]==0) { sg[i]=j; break; } } } int main() { int i,l,m,num; //freopen("d:\\1.txt","r",stdin); while(scanf("%d",&k)!=EOF&&k) { for(i=0;i<k;i++) cin>>a[i]; SG(); //调用SG函数 cin>>m; while(m--) { int s=0; cin>>l; while(l--) { cin>>num; s=s^sg[num]; } if(s)cout<<"W"; else cout<<"L"; } cout<<endl; } return 0; }
一开始无限WA,还没找到错在哪,就是构造sg函数稍微不同,测试数据和上面的一样,SG函数数据也一样,但一直没AC,有哪位大牛看到错误帮忙指点错在哪,未AC代码如下:
#include<iostream> using namespace std; #include<algorithm> #include<string.h> #define M 10010 int a[110],b[110],d[110]; int c[M]; void fun(int a[],int k) //构造 Sprague-Grundy函数 { int i,j,m,k1; memset(c,0,sizeof(c));//对c数组进行清零 sort(a,a+k);//将其排序 for(i=1;i<=10000;i++) { k1=0; memset(d,0,sizeof(d)); if(i<a[0]) { c[i]=0; continue; } for(j=0;j<k;j++) if(i<a[j])break; for(m=0;m<j;m++) d[k1++]=c[i-a[m]]; sort(d,d+k1);//将其排序 for(m=0;;m++) if(m!=d[m]) { c[i]=m; break; } } } int main() { int m,i,k; //freopen("d:\\1.txt","r",stdin); while(~scanf("%d",&k)&&k) { int l,s; for(i=0;i<k;i++) cin>>a[i]; fun(a,k); /*for(i=0;i<10000;i++) printf("%d ",c[i]); printf("\n"); getch();*/ cin>>m; while(m--) { s=0; cin>>l; for(i=0;i<l;i++) { cin>>b[i]; s=s^c[b[i]]; } if(s)cout<<"W"; else cout<<"L"; } printf("\n"); } return 0; }