• NOJ——1672剪绳子(博弈)


    • [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
      ");
      		else if(m==1)//特判
      		{
      			if(n&1)
      				printf("First
      ");
      			else
      				printf("Second
      ");
      		}
      		else if(m>=n)//特判
      			printf("First
      ");
      		else//一般情况,Second最差情况下取1就能分两段
      			printf("Second
      ");
      	}
      	return 0;
      }
  • 相关阅读:
    Mysql常用函数总结(二)
    mysql百万的数据快速创建索引
    php 中的sprintf 坑
    php5.5之后新特性整理
    mysql实践总结
    php下载远程图片到本地
    搜藏一个php文件上传类
    Attribute基本介绍
    Fiddler4抓包工具使用教程一
    HTTP传输数据压缩
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766394.html
Copyright © 2020-2023  润新知