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 "); 33 else printf("Second "); 34 } 35 return 0; 36 }