Stone Game, Why are you always there? HDU

题目链接: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 }
原文地址:https://www.cnblogs.com/zpj61/p/13571238.html