hdu1536博弈论sg函数
用sg函数对每组数据中所有的数处理。。得到的结果异或。为0必输。。否则必胜
#include<iostream> //#include<algorithm> #include<set> #include<cstdio> using namespace std; //const int MAXK=102; const int MAXM=102; //const int MAXL=102; const int MAXH=10002; set<int>de; int dp[MAXH]; inline int sg(int cur) { if(dp[cur]!=-1) { return dp[cur]; } int i; set<int>::const_iterator cp; bool visited[MAXM]; memset(visited,0,sizeof(visited)); if(cur==0) { return dp[cur]=0; } bool tag=0; for(cp=de.begin();cp!=de.end();cp++) { if(cur-*cp>=0) { int r; if(dp[cur-(*cp)]!=-1) { r=dp[cur-(*cp)]; }else { r=sg(cur-(*cp)); } if(r==0) { tag=1; } //cout<<r<<" "; visited[r]=1; }else { break; } } i=0; int mex; if(tag) { int j=0; while(visited[j]) { j++; } return dp[cur]=j; }else { return dp[cur]=0; } } int main() { int k; while(scanf("%d",&k)!=EOF) { memset(dp,-1,sizeof(dp)); de.clear(); if(k==0) { break; } int i; for(i=0;i<=k-1;i++) { int s; scanf("%d",&s); de.insert(s); } int m; scanf("%d",&m); bool result[MAXM]; /*for(i=0;i<=10000;i++) { sg(i); }*/ for(i=0;i<=m-1;i++) { int l; scanf("%d",&l); int j=0; int sum=0; for(j=0;j<=l-1;j++) { int heap; scanf("%d",&heap); sum=sum^sg(heap); } if(sum) { result[i]=1; }else { result[i]=0; } } for(i=0;i<=m-1;i++) { if(result[i]) { printf("W"); }else { printf("L"); } } printf("\n"); } return 0; }
本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
独立博客:http://nfeng.cc/