【牛客 - 302哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(低年級)】小樂樂吃糖豆 (fIb博弈)
阿新 • • 發佈:2018-12-06
題幹:
小樂樂是一個比較喜歡吃糖豆的小孩子,小樂樂的哥哥大樂樂也同樣愛吃糖豆。
作為一個小孩子,他們永遠覺得誰吃掉了最後一個糖豆,誰吃的糖豆最多。
為了公平起見小樂樂與大樂樂商量吃糖豆的規則如下:
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 ; }