题目描述
小花梨有n堆石子,第i堆石子数量为ai,n堆石子顺时针编号为1−n(如图)。
游戏将进行n轮,每轮游戏单独进行,互不干扰,每轮初始时第i堆石子数目为ai。
第i轮从编号为i的那堆石子为起点,顺时针来取石子。两人轮流取石子,不可不取,最少取一个石子,最多把当前这一堆取完,只有取完一堆后才走到下一堆石子。走完一圈后石子都被取完,不能取石子的人就失败。假设两人以最优策略进行取石子操作,请分别输出n轮游戏是先手胜还是后手胜。
输入
第一行为正整数n,表示石子的堆数(1≤n≤100000)
第二行输入n个正整数表示每一堆的石子数目ai(1≤ai≤109)
输出
输出n行,第i行表示第i轮游戏的结果。如果先手胜则输出"First",后手胜输出"Second"。
样例输入
3 2 1 3
样例输出
First Second First
提示
游戏进行3轮
第1轮游戏石子堆下标的顺序为1 2 3,此时石子数目按顺序为2 1 3,先手胜
第2轮游戏石子堆下标的顺序为2 3 1,此时石子数目按顺序为1 3 2,后手胜
第3轮游戏石子堆下标的顺序为3 1 2,此时石子数目按顺序为3 2 1,先手胜
题目分析:这道题属于思维题,题目给出的是假设两个人都以最优的策略进行取石子操作,那么这几分两种情况了,一种是全是1的情况,这种事判断一的个数如果是偶数则第二个人获胜,奇数的话是第一个人获胜。不全是1的话需要判断谁第一次拿的那一堆不是1的情况谁就获胜,因为如果这一堆是一个石子的话他没有选择,只能拿这一个石子,只要是大于1(大于等于2)那么这个人就有选择的权利,他就会获胜。
代码如下:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll dis[121210];
ll a[121210];
int main()
{
ll n;
ll num=0;
scanf("%lld",&n);
ll k=0,d=0;
for(ll i=0;i<n;i++){
scanf("%lld",&dis[i]);
if(dis[i]==1)
num++;
}
ll p=0;
for(ll i=n-1;i>=0;i--)
{
if(dis[i]!=1){
a[i]=-1;
p=i;
}
else
{
a[i]=p-i;
}
}
ll b=0;
for(ll i=0;i<n;i++)
{
if(dis[i]==1)
{
b++;
}
else
break;
}
for(ll i=n-1;i>=0;i--)
{
if(dis[i]==1)
{
a[i]=n-i+b;
}
else
break;
}
// for(int i=0;i<n;i++)
//printf("%lld ",a[i]);
if(num==n)
{
if(n%2==0)
for(ll i=0;i<n;i++)
printf("Second\n");
else{
for(ll i=1;i<=n;i++)
printf("First\n");
}
}
else
{
for(ll i=0;i<n;i++)
{
if(a[i]==-1)
printf("First\n");
else
{
if(a[i]%2==1)
printf("Second\n");
else
printf("First\n");
}
}
}
return 0;
}