“美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
“美登杯”上海市高校大學(xué)生程序設(shè)計(jì)邀請(qǐng)賽 (華東理工大學(xué))
D. 小花梨的取石子游戲
Description
小花梨有?堆石子,第?堆石子數(shù)量為??,?堆石子順時(shí)針編號(hào)為1 ? ?(如圖)。
游戲?qū)⑦M(jìn)行 游戲?qū)⑦M(jìn)行?輪, 輪, 每輪游戲 單獨(dú)進(jìn)行 ,互不干擾 ,每輪初始時(shí)第 每輪初始時(shí)第? 堆石子數(shù)目為??。 。
第?輪從編號(hào)為?的那堆石子為起點(diǎn),順時(shí)針來(lái)取石子。兩人輪流取石子,不可不取,最少取
一個(gè)石子,最多把當(dāng)前這一堆取完,只有取完一堆后才走到下一堆石子。走完一圈后石子都
被取完,不能取石子的人就失敗。假設(shè)兩人以最優(yōu)策略進(jìn)行取石子操作,請(qǐng)分別輸出?輪游
戲是先手勝還是后手勝。
Input
第一行為正整數(shù)?,表示石子的堆數(shù) (1 ≤ ? ≤ 100000)
第二行輸入?個(gè)正整數(shù)表示每一堆的石子數(shù)目??(1 ≤ ?? ≤ 10 9 )
Output
輸出?行,第?行表示第?輪游戲的結(jié)果。如果先手勝則輸出"?????",后手勝輸出"??????"。
Example
Sample Input Sample Output
3
2 1 3
First
Second
First
2
2 2
First
First
Note
樣例1:
游戲進(jìn)行3輪
第11 2 32 1 3,先 第22 3 11 3 2,后 第3輪游戲石子堆下標(biāo)的順序?yàn)? 1 2,此時(shí)石子數(shù)目按順序?yàn)? 2 1,先手勝
思路:
現(xiàn)在只考慮每一輪游戲
1.一堆的時(shí)候是必勝態(tài)
多堆的時(shí)候
起點(diǎn)數(shù)目大于1,是必勝態(tài) 因?yàn)榭梢匀⊥昊蛘呷〉弥皇O乱粋€(gè),這兩種狀態(tài)的勝負(fù)一定同,也就是說(shuō)一定可以到達(dá)必?cái)B(tài),所以此時(shí)為必勝態(tài)若起點(diǎn)數(shù)目等于1,則和下一點(diǎn)的狀態(tài)相反
那么我們可以先把a(bǔ)數(shù)組長(zhǎng)度擴(kuò)展為2倍(復(fù)制一遍在后面,因?yàn)橐幚硪悦恳粋€(gè)i為起始位置)從后向前維護(hù)一下1的連續(xù)個(gè)數(shù)即可。
當(dāng)整個(gè)數(shù)組全為1的時(shí)候,特判n的奇偶出答案即可。
細(xì)節(jié)見(jiàn)代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <iomanip> #define ALL(x) (x).begin(), (x).end() #define sz(a) int(a.size()) #define all(a) a.begin(), a.end() #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), '\0', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define eps 1e-6 #define gg(x) getInt(&x) #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl using namespace std; typedef long long ll; ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;} ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;} inline void getInt(int* p); const int maxn = 1000010; const int inf = 0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ int a[maxn]; int n; int b[maxn]; int flag=1; int main() {//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);gbtb;cin>>n;repd(i,1,n){cin>>a[i];a[i+n]=a[i];}for(int i=n*2;i>=1;--i){if(a[i]==1){b[i]=b[i+1]+1;}else{b[i]=0;flag=0;}}if(flag){repd(i,1,n){if(!(n&1)){cout<<"Second"<<endl;}else{cout<<"First"<<endl;}}}else{repd(i,1,n){if(!b[i]){cout<<"First"<<endl;continue;}if(b[i]&1){cout<<"Second"<<endl;}else{cout<<"First"<<endl;}}}return 0; }inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}} }轉(zhuǎn)載于:https://www.cnblogs.com/qieqiemin/p/11462027.html
總結(jié)
以上是生活随笔為你收集整理的“美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 遇到问题了 .net项目发布到iis6,
- 下一篇: Interesting Finds: 2