【BZOJ】【2940】【POI2000】条纹

博弈论

  一开始想成S-Nim了……后来发现不一样= =石子是一定得取的,但是这个铺条纹就像Crosses and Crosses一样,是可以铺到中间,左右留下空隙但是对手无处可放的……

  所以就是两道题的方法结合一下咯~

  

 1 /**************************************************************
 2     Problem: 2940
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:60 ms
 7     Memory:1276 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2940
11 #include<cstdio>
12 #include<cstring>
13 #include<iostream>
14 #define F(i,j,n) for(int i=j;i<=n;++i)
15 int getint(){
16     int v=0,sign=1; char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
18     while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
19     return v*sign;
20 }
21 const int N=1010,INF=~0u>>2;
22  
23 int a[4],SG[N];
24 bool mark[N];
25 int main(){
26     F(i,1,3) a[i]=getint();
27     int n=getint();
28     F(i,1,1000){
29         memset(mark,0,sizeof mark);
30         F(j,1,3)
31             for(int k=0;k<=i-a[j]-k;++k)
32                 mark[SG[k]^SG[i-a[j]-k]]=1;
33         F(j,0,i) if (!mark[j]) {SG[i]=j; break;}
34     }
35     F(i,1,n) {
36         printf("%d",SG[getint()] ? 1 : 2);
37         if (i!=n) printf("
");
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/Tunix/p/4305608.html