链接: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;
}