HDU2188 && HDU2149 && HDU1846

2188题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188

2149题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149

1846题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846

两个题都倒过来想,假如现在募捐箱里面有n元钱,两个人每次至少取一元钱,最多取m元钱,最后一个取光的人为胜者,就是一个简单的巴什博弈。

第三个题本来就是倒着的。


巴什博弈有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜。

1.我们现在想想假如现在局面上就剩下了m + 1个物品,那么先手必输,自己想为什么。

2.现在推广到 n =  k * ( m + 1)个物品,假设先手取 t个,那么后手只要保证每次都取 m + 1 - t个,那么最后还是转化到第一种情况。

3.如果 n = k * ( m + 1) + a ( 0 < a <= m) ,那么先手必胜了,因为只要先手取a个,就变成了第2种情况的后手,所以必胜!


代码:

2188

#include <cstdio>

int main()

{
    int _;
    while(~scanf("%d",&_))
    {
        while(_--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            if(n % (m + 1) == 0)
                printf("Rabbit\n");
            else
                printf("Grass\n");
        }
    }
    return 0;
}


2149

#include <cstdio>

int main()

{
    int m,n;
    while(~scanf("%d%d",&m,&n))
    {
        if(m < n)
        {
            for(int i = m;i <= n;++i)
            {
                if(i == m)
                    printf("%d",i);
                else
                    printf(" %d",i);
            }
            printf("\n");
        }
        else if(m % (n + 1) == 0)
            printf("none\n");
        else
        {
            printf("%d\n",m % (n + 1));
        }
    }
    return 0;
}


1846


#include <cstdio>

int main()

{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        if(n % (m + 1) == 0)
            printf("second\n");
        else
            printf("first\n");
    }
    return 0;
}


你可能感兴趣的:(ACM,巴什博弈)