Description
小花梨有𝑛堆石子,第𝑖堆石子数量为𝑎𝑖,𝑛堆石子顺时针编号为1 − 𝑛(如图)。
游戏将进行𝒏轮,每轮游戏单独进行,互不干扰,每轮初始时第𝒊堆石子数目为𝒂𝒊。
第𝑖轮从编号为𝑖的那堆石子为起点,顺时针来取石子。两人轮流取石子,不可不取,最少取
一个石子,最多把当前这一堆取完,只有取完一堆后才走到下一堆石子。走完一圈后石子都
被取完,不能取石子的人就失败。假设两人以最优策略进行取石子操作,请分别输出𝑛轮游
戏是先手胜还是后手胜。
Input
第一行为正整数𝑛,表示石子的堆数 (1 ≤ 𝑛 ≤ 100000)
第二行输入𝑛个正整数表示每一堆的石子数目𝑎𝑖(1 ≤ 𝑎𝑖 ≤ 109
)
Output
输出𝑛行,第𝑖行表示第𝑖轮游戏的结果。如果先手胜则输出"𝐹𝑖𝑟𝑠𝑡",后手胜输出"𝑆𝑒𝑐𝑜𝑛𝑑"。
Example
Sample Input Sample Output
3
2 1 3
First
Second
First
2
2 2
First
First
Note
样例1:
游戏进行3轮
第1轮游戏石子堆下标的顺序为1 2 3,此时石子数目按顺序为2 1 3,先手胜
第2轮游戏石子堆下标的顺序为2 3 1,此时石子数目按顺序为1 3 2,后手胜
第3轮游戏石子堆下标的顺序为3 1 2,此时石子数目按顺序为3 2 1,先手胜

思路:如果当前堆(第i堆)大于1,先手必胜

          如果当前堆为1,且之后连续有x堆1,如果(x+1)为偶数,先手必胜,若为偶数,后手必胜

#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
#include <string.h>
#define MAXN 10000 + 10
#define N 20
#define ll long long
using namespace std;
int a[100025],sum[200050];
int js(int j,int n)
{
    int s=0;
    for(int i=j;;i++)
    {
        if(i==n+1) i=1;
        if(a[i]!=1) break;
        s++;
        if(s==n) break;
    }
    return s;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int w=0;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        if(js(1,n)==n)
        {
            for(int i=1;i<=n;i++)
            {
                if(n%2==1)
                {
                    printf("First\n");
                }
                else
                {
                    printf("Second\n");
                }
            }
            continue;
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i]!=1)
            {
                printf("First\n");
                w++;
                if(w==n) break;
            }
            else
            {
                int m,t;
                m=js(i,n);
                t=m;
                //printf("t=%d ",t);
                while(t--)
                {
                    //printf("t=%d\n",t+1);
                    if((t+1)%2==0)
                    {
                        printf("First\n");w++;
                        if(w==n)
                        {
                            i=2*n;
                             break;
                        }
                    }
                    else
                    {
                        printf("Second\n");w++;
                        if(w==n)
                        {
                            i=2*n;
                            break;
                        }
                    }
                }
                i+=m-1;

            }
        }
    }
}
/*
5 10 5 15 10
1 2 3 4 5
*/