小樂樂吃糖豆
阿新 • • 發佈:2018-12-08
連結: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;
}