小花梨的取石子游戏

博客围绕小花梨的石子取拿游戏展开,游戏有n堆石子,进行n轮,每轮从编号为i的堆开始顺时针取。两人轮流取,取完一堆到下一堆,取完一圈,不能取的人输。给出思路,不为1时先手必胜,为1时先选到不为1的数者胜,还需特判都为1的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值