1. 程式人生 > >小樂樂吃糖豆

小樂樂吃糖豆

連結: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;
}