• 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;
      }
  • 相关阅读:
    PHP学习笔记(一)
    切记数据类型的最大范围
    (转)女程序员的生活,真苦涩。
    向模态窗体传递参数和获取返回值
    在ASP.NET 中实现单点登录(单域名)
    错误:访问IIS 元数据库失败
    Page.registerstartupscript方法用法介绍
    IIS安装配置的问题
    GridView的双击等几个事件
    解决IIS不能启动,提示服务器没有及时响应启动或控制请求
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766394.html
Copyright © 2020-2023  润新知