【模版】hdu1536 S-Nim

看刘汝佳《算法竞赛入门经典训练指南》2.4
只看了点皮毛……
hdu1536

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10005
#define M 105
using namespace std;
int sg[N],can[M];
int n,m,k;
bool vis[N];
int dfs_sg(int x){
    if(vis[x]) return sg[x];
    vis[x]=1;
    bool mex[105]={0};
    for(int i=1;i<=n;i++)
        if(x>=can[i]) mex[dfs_sg(x-can[i])]=1;
    for(int i=0;;i++) if(!mex[i]) {sg[x]=i;return sg[x];}
}
int main(){
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    while(scanf("%d",&n)){
        if(n==0) break;
        for(int i=1;i<=n;i++) scanf("%d",&can[i]);
        scanf("%d",&m);
        memset(sg,0,sizeof(sg));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=m;i++){
            scanf("%d",&k);
            int ans=0,x;
            for(int j=1;j<=k;j++)
                scanf("%d",&x),ans^=dfs_sg(x);
            //printf("\n**%d %d\n",5,sg[5]);
            if(ans==0) printf("L");
            else printf("W");
        }
        printf("\n");
    }
    return 0;
}
发布了87 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/yxr0105/article/details/51382619