小乐乐吃糖豆

链接:https://ac.nowcoder.com/acm/contest/302/G
来源:牛客网
 

题目描述

    小乐乐是一个比较喜欢吃糖豆的小孩子,小乐乐的哥哥大乐乐也同样爱吃糖豆。

作为一个小孩子,他们永远觉得谁吃掉了最后一个糖豆,谁吃的糖豆最多。

为了公平起见小乐乐与大乐乐商量吃糖豆的规则如下:

1.     小乐乐与大乐乐轮流吃糖豆。

2.     小乐乐作为弟弟,小乐乐先吃糖豆。

3.     小乐乐第一次可以吃任意不超过n 个糖豆。(n为糖豆初始总数)

4.     后一个人每次能吃【1,前一个人吃的糖豆*2】

    已知有n个糖豆,小乐乐与大乐乐开始分食糖豆,小乐乐与大乐乐都采用最优策略,请问谁能吃到最后一粒糖豆?

输入描述:

第一行输入整数n(2<=n<=1000)。

输出描述:

输出吃到最后一颗糖豆的人的名字。”Small”(小乐乐)/“Big”(大乐乐)。

示例1

输入

2

输出

Big

说明

小乐乐只能拿1个,大乐乐会吃掉最后一个。

示例2

输入

4

输出

Small

说明

小乐乐取走一个,大乐乐只能取走【1,2】个,无论大乐乐取走几个小乐乐都会吃掉最后一个。

小乐乐第一次可以吃任意不超过n个糖豆,后面的那个人吃的糖豆范围是[1,前一个人吃的糖豆数*2]
(这是一个取值区间),根据博弈的思想,如果说第一个人每次都吃不超过三分之一,那么第二个人
不会再本次吃完所有糖豆,第二个人也按照第一个人的方法来吃糖豆,以此类推。

开一个数组a[1005],用来记录是小乐乐赢还是大乐乐赢,a[i]=0的时候是大乐乐赢
那么输入一个n,就可以通过a[n]的值来判断谁赢了
1.判断i能能整除3,如果能整除三的话,就取ans=i/3-1;(比如:如果一共有6个糖果,如果说小乐乐吃了
 6/3=2个糖果,大乐乐就可以吃2*2=4个,这个时候小乐乐会输,所以应该让6/3-1)
2.如果i不能够整除3,就取ans=i/3;
ans是第x个人吃的糖豆数(一共有i颗糖),i-ans是上一个人吃的糖豆数,这个时候问题就可以转化为上一个人吃糖豆,如果说上一个人(x-1)输,那么
下一个人(x)就会赢。

#include<stdio.h>
int main()
{
    int a[1005],i,j,n,ans;
    a[2]=0;
    a[3]=0;
    a[4]=1;
    for(i=5; i<1001; i++)
    {
        if(i%3)
            ans=i/3;
        else
            ans=i/3-1;
        for(j=i-ans;;j++)
        {
            if(a[j]==0)
            {
                a[i]=1;
                break;
            }
            if(j==i)
            {
                a[i]=0;
                break;
            }
        }
    }
    scanf("%d",&n);
    if(a[n]==1)
        printf("Small");
    else
        printf("Big");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zbq_tt5/article/details/84870281