NOJ——剪绳子(博弈)

  • [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;
    }

你可能感兴趣的:(NOJ——剪绳子(博弈))