1. 程式人生 > >【牛客 - 302哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(低年級)】小樂樂吃糖豆 (fIb博弈)

【牛客 - 302哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(低年級)】小樂樂吃糖豆 (fIb博弈)

題幹:
 

 小樂樂是一個比較喜歡吃糖豆的小孩子,小樂樂的哥哥大樂樂也同樣愛吃糖豆。

作為一個小孩子,他們永遠覺得誰吃掉了最後一個糖豆,誰吃的糖豆最多。

為了公平起見小樂樂與大樂樂商量吃糖豆的規則如下:

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 ;
 }