HDU2188 && HDU2149 && HDU1846

来源:互联网 发布:荣耀v10网络制式 编辑:程序博客网 时间:2024/06/02 20:46

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;}


0 0