【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("\n"); 38 } 39 return 0; 40 }