题干:
小乐乐是一个比较喜欢吃糖豆的小孩子,小乐乐的哥哥大乐乐也同样爱吃糖豆。
作为一个小孩子,他们永远觉得谁吃掉了最后一个糖豆,谁吃的糖豆最多。
为了公平起见小乐乐与大乐乐商量吃糖豆的规则如下:
1. 小乐乐与大乐乐轮流吃糖豆。
2. 小乐乐作为弟弟,小乐乐先吃糖豆。
3. 小乐乐第一次可以吃任意不超过n 个糖豆。(n为糖豆初始总数)
4. 后一个人每次能吃【1,前一个人吃的糖豆*2】
已知有n个糖豆,小乐乐与大乐乐开始分食糖豆,小乐乐与大乐乐都采用最优策略,请问谁能吃到最后一粒糖豆?
输入描述:
第一行输入整数n(2<=n<=1000)。
输出描述:
输出吃到最后一颗糖豆的人的名字。”Small”(小乐乐)/“Big”(大乐乐)。
示例1
输入
复制
2
输出
复制
Big
说明
小乐乐只能拿1个,大乐乐会吃掉最后一个。
示例2
输入
复制
4
输出
复制
Small
说明
小乐乐取走一个,大乐乐只能取走【1,2】个,无论大乐乐取走几个小乐乐都会吃掉最后一个。
解题报告:
数据水了,,很多人直接放过去了。。其实就是个Fib博弈。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int fib[105];
int main()
{int n;fib[1]=1;fib[2]=2;for(int i = 3; i<=20; i++) fib[i] = fib[i-1]+fib[i-2];cin>>n;if(binary_search(fib+1,fib+20,n)) puts("Big");else puts("Small");return 0 ;}