zoukankan      html  css  js  c++  java
  • 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;
      }
  • 相关阅读:
    关于prototype学习
    java io 从文件的读取和输入
    java 匿名内部类
    动手做个 AI 机器人,帮我回消息!
    几个高效做事的法则,让你的一天有 25 小时
    爆肝一个月,我做了个免费的面试刷题网
    Log4j 被曝核弹级漏洞,开发者炸锅了!
    几个超火的编程网站,别错过!
    Java 处理表格,真的很爽!
    c++智能指针转化:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766394.html
Copyright © 2011-2022 走看看