大致思路:
这道题就是典型的讲解中提到的“每次取石子的数量是不连续的”,那么就用模板——打表法。
就是模板题。
代码:
#include<iostream> #include<bits/stdc++.h> using namespace std; int S[105]; int sg[105]; const int maxc=10005; int vis[maxc]; int n; void getsg() //打表法 { for(int i=1;i<=maxc;i++) //对于石子数为1 2 3...maxc的一堆石子,sg值分别是多少 { memset(vis,0,sizeof(vis)); for(int j=1;S[j]<=i&&j<=n ;j++) { vis[sg[i-S[j]]]=1; //后续 } for(int k=0;k<=maxc;k++) { if(vis[k]==0) { sg[i]=k; break; //之前一直卡,发现错因在忘了写break T T } } } } int main() { cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&S[i]); } sort(S+1,S+n+1); getsg(); int m; cin>>m; while(m--) { int d; scanf("%d",&d); int ans=0; for(int i=1;i<=d;i++) { int c; scanf("%d",&c); ans^=sg[c]; } if(ans==0) cout<<"L"; else cout<<"W"; } return 0; }