hdu 1536 S-Nim (SG函数经典题)

来源:互联网 发布:通用led显示屏软件 编辑:程序博客网 时间:2024/06/05 02:04

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1536

题目大意:有一个集合S,里面有k个数,玩取石子游戏,每次只能取S中的一个数,玩n次,分别判断先手胜负。

思路:SG问题经典题,知道SG问题的人应该都会吧。。 不说什么了,不懂得可以看看我转的两篇博客。。

昨天一直听别人说SG什么的,不知道是什么,今天去学了一下,挺厉害的~~ 自己第一道SG题,纪念一下~~  = =

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int k;int sg[11111];int enable[111];int get_sg(int n){    if(sg[n]!=-1) return sg[n];    int hash[111] = {0};    for(int i = 0;i<k;i++)    {        int tmp = n - enable[i];        if(tmp<0)            break;        if(sg[tmp]==-1)            sg[tmp] = get_sg(tmp);        hash[sg[tmp]] = 1;    }    for(int i = 0;;i++)        if(hash[i]==0)            return i;}int main(){    while(~scanf("%d",&k)&&k)    {        for(int i = 0;i<k;i++)            scanf("%d",&enable[i]);        sort(enable,enable+k);        memset(sg,-1,sizeof(sg));        sg[0] = 0;        int m;        scanf("%d",&m);        while(m--)        {            int n;            scanf("%d",&n);            int ans = 0;            while(n--)            {                int a;                scanf("%d",&a);                ans ^= get_sg(a);            }            if(ans==0)                printf("L");            else printf("W");        }        puts("");    }    return 0;}


原创粉丝点击