小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图)。 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??。 第?轮从编号为?的那堆石子为起点,顺时针来取石子。两人轮流取石子,不可不取,最少取 一个石子,最多把当前这一堆取完,只有取完一堆后才走到下一堆石子。走完一圈后石子都 被取完,不能取石子的人就失败。假设两人以最优策略进行取石子操作,请分别输出?轮游 戏是先手胜还是后手胜。
题目链接:https://acm.ecnu.edu.cn/contest/173/problem/D/
思路:不为1的情况下,先手可以控制石子取次数的单双,所以不为1的情况下先手必胜。为1时找到下一个不为1的数,是谁先选到不为1的数谁胜,(注意特判都为1的情况)
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
int n,A[100010],B[100010];
int main()
{
while(~scanf("%d",&n))
{
int flag=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&A[i]);
if(A[i]!=1&&flag==0)
flag=i;
}
if(flag==0)
{
for(int i=1;i<=n;++i)
{
printf("%s\n",n&1?"First":"Second");
}
}
else
{
memset(B,-1,sizeof(B));
int cut=0;
for(int i=flag;;--i)
{
if(i==0) i=n;
if(B[i]!=-1) break;
if(A[i]==1)
B[i]=++cut;
else
{
B[i]=cut=0;
}
}
for(int i=1;i<=n;i++)
printf("%s\n",B[i]&1?"Second":"First");
}
}
return 0;
}