题目链接:https://vjudge.net/problem/HDU-2999
题意:有N堆石头,两个人交替取,每次只能取连续的k个石子,最后没有石子取得人输。
思路:如果我们每次取靠边的k个,那么转移方程就是sg[i-x],再模拟mex{}即可,如果取得是中间的那么就有可以分成几堆处理了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int sg[1010],vis[1010],a[1010]; 5 int n,m; 6 void init() 7 { 8 for(int i=1;i<=n;i++) cin>>a[i]; 9 sort(a+1,a+1+n); 10 sg[0]=0; 11 for(int i=1;i<=1000;++i) 12 { 13 memset(vis,0,sizeof vis); 14 for(int j=1;j<=n;j++) 15 { 16 if(a[j]>i) break; 17 vis[sg[i-a[j]]]=1; 18 if(i-a[j]>1) 19 { 20 int tot=i-a[j]; 21 for(int k=1;k<=tot-1;k++) 22 { 23 vis[sg[k]^sg[tot-k]]=1; 24 } 25 } 26 } 27 int j=0; 28 while(vis[j]) j++; 29 sg[i]=j; 30 } 31 } 32 int main() 33 { 34 while(cin>>n) 35 { 36 int k; 37 init(); 38 cin>>m; 39 while(m--) 40 { 41 cin>>k; 42 puts(sg[k]?"1":"2"); 43 } 44 } 45 return 0; 46 }