ACM中的博弈论入门(二) POJ 2960 SG 函数的应用

来源:互联网 发布:淘宝金牌卖家怎么申请 编辑:程序博客网 时间:2024/05/21 20:28
题意:N个堆,每次可从一个堆中取走{a,b,c,……}个石子。不能取者负。 从 1 to 10000 构造sg 函数即可譬如  1 2 4可取对任意 x  其sg 由 x-1 x-2 x-4 (如果非负)决定而由于 是 从 1开始向上求的,就类似dp , 是记录的,无需递归计算……一开始用递归,写了好久……写恶心了……</strong></span>
#include <iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>#include<stack>#define LL long longusing namespace std;#define MAX 10000int k,p,q;int s[105];int mex[MAX+5];bool pd[105];int Mex(int a){memset(pd,0,sizeof(pd));for(int i=0;i<k;i++){int r=a-s[i];if(r>=0)pd[mex[r]]=1;}for(int i=0;;i++){if(pd[i]==0){return i;}}}int main(){while(scanf("%d",&k)&&k){for(int i=0;i<k;i++)scanf("%d",&s[i]);for(int i=1;i<=MAX;i++)mex[i]=Mex(i);scanf("%d",&p);while(p--){scanf("%d",&q);int n=0;while(q--){int m;scanf("%d",&m);n^=mex[m];}printf("%c",!n?'L':'W');}printf("\n");}return 0;}


0 0