NOJ——1672剪绳子(博弈)

32 篇文章 0 订阅
15 篇文章 0 订阅
  • [1672] 剪绳子

  • 时间限制: 500 ms 内存限制: 65535 K
  • 问题描述
  • 已知长度为n的线圈,两人依次截取1~m的长度,n, m为整数,不能取者为输。

  • 输入
  • 输入n, m;( 0 <= n <= 1000000000, 1 <= m <= 1000000000)
  • 输出
  • 先手胜输出First,否者输出Second。
  • 样例输入
  • 3 2
    1 1
  • 样例输出
  • Second
    First

    做法:

          除特判外正常情况下First将一个绳环取掉一段,变成一根绳子,然后Second将

    这根绳子再取掉一部分,变成两段,那么接下来不管First怎么取,Second一直模仿着

    First取就一定能赢,此题刚开始以为是跟巴什博弈,经过大神指点发现不同点在于巴

    什博弈若放在此题这两人从头到尾将会是共用一根绳子而且只能从两边开始截即绳子

    不会变成两段。但是这道题是可以任意截取1~m范围内的长度,隐藏了一点就是一个

    人最多只能截完他选的那一段绳子,即就算可以截1~1000000米的长度,然而现在的

    绳子只有1、2、3米各一段,也只能截1、2、3米中的一种,无形之中又限定了截取的

    范围,这样一来Second才有更大的机会赢。

          然后看正常情况下只要在First将绳环截成一段绳子之后Second可以将这段绳子分

    成两段那么Second就一定赢了,因此判断点在于Second能否成功分掉绳子。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    int main(void)
    {
    	int n,m;
    	while (~scanf("%d%d",&n,&m))
    	{
    		if(n==0)//特判
    			printf("Second\n");
    		else if(m==1)//特判
    		{
    			if(n&1)
    				printf("First\n");
    			else
    				printf("Second\n");
    		}
    		else if(m>=n)//特判
    			printf("First\n");
    		else//一般情况,Second最差情况下取1就能分两段
    			printf("Second\n");
    	}
    	return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值