CF-1382B. Sequential Nim(博弈,模拟)

CF传送门

洛谷传送门


解题思路

首先一种不动脑子的做法就是模拟(就是我的做法)

从后往前推,用一个变量y记录状态,枚举到第i堆时,y==1表示到第i堆需要的先手才能胜,y==0表示到第i堆需要后手才能胜。

推到第1位时,若y==1,则first胜,否则second胜。

代码见下方。

写出代码后发现,影响y的其实只有数量为1的前i堆。

于是我们继续探究(题解)不难发现,当遇到某一堆(数量大于1)且你是先手时,你就主宰了游戏,

因为你可以取k-1个使下一堆仍是你先手,或者去k个使下一堆你后手以便经过奇数个数量为1的堆后夺回先手权。

所以真正影响的就是谁先遇到数量大于1的一堆,即前缀1的数量。

AC代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 #include<vector>
11 #include<iomanip>
12 #include<ctime>
13 #include<stack>
14 using namespace std;
15 const int maxn=100005;
16 int n,a[maxn],t; 
17 int main()
18 {
19     cin>>t;
20     while(t--){
21         int y=1;
22         scanf("%d",&n);
23         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
24         for(int i=n-1;i>=1;i--){
25             if(a[i]==1){
26                 if(y==1) y=0;
27                 else y=1;
28             }else{
29                 y=1;
30             }
31         }
32         if(y==1) printf("First\n");
33         else printf("Second\n");
34     }
35     return 0;
36 }

 

posted @ 2021-04-27 23:53  尹昱钦  阅读(69)  评论(0编辑  收藏  举报