Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

Nic和Susan在玩一个有趣的游戏:在游戏开始前,他们先约定一个正整数n,同时令m=1。游戏过程中,每个人都可以将m的值扩大2到9中的 

任意倍数。第一个使得m≥n的人就是最后的赢家。 

假设Nic和Susan都十分聪明,并且游戏过程中都使用最佳的策略,问谁会是最后的赢家(Nic总是第一个先玩)。

【输入格式】

一个正整数n(1≤n≤2^32-1)。

【输出格式】

在使用最佳的策略的情况下,如果Nic必胜,则输出“Nic”。如果Susan必胜,则输出“Susan”。否则输出“God”。

【数据规模】

Sample Input1

9

Sample Output1

Nic
【题解】
等价题意如下

给定N,Nic和Susan轮流将N整除2~9,第1个使N<=1的人赢。

Nic先手,问对于给定的N谁必胜。谁必胜
设f[n]表示N为n时是先手赢还是先手输。
转移
假设x ∈{2,3,4,5,6,7,8,9};
如果n/x为整数。则M=n/x否则M= (n / x)+1 这里的除法是整除运算。直接去尾。
然后f[n] = f[n] || !f[M];
我们这里的讲解围绕那个等价题意展开。
F[1..9]都为true表示Nic只要除一下就能<=1了。所以是先手赢。
然后我们对F[t]考虑。
如果f[t/x](这里的x∈上面那个区间)是先手输。也就是说先手从t/x开始会输。
那么我们只要让t/x变成t就好了,然后就变成先手赢了。
因为你是t。然后除一个x就变成t/x了。然后先手就不是nic了。而是Susan.而f[t/x]==true表示在t/x时先手(这下变成Susan)一定会输。那不就等价为f[t]是先手(nic)赢了吗?
根据这样的规律我们可以写出以下程序
(注意:下面这个程序不足以过所有的数据);
memset(bo, false, sizeof(bo));

for (int i = 1; i <= 9; i++)

{

bo[i] = true;

}

for (int i = 10; i <= 21999999; i++)

for (int j = 2; j <= 9; j++)

{

int mm;

if ((i %j) == 0)

mm = i / j;

else

mm = (i / j) + 1;

if (!bo[mm])

bo[i] = true;

}
然后我们用这个程序求出bo[1..2000]的值。进而可以发现规律
—n =[1, 9],先手必胜
—n =[10, 18],先手必败即后手必胜
—n =[19, 162],先手必胜
—n =[163, 324],先手必败即后手必胜
也就是先手胜i = 9 if (n<=9) 先手
后手胜i=i*2 if (n <=i) 后手
先手胜i=i*9 if (n <=i) 先手
后手胜i=i*2 if (n <= i)后手
i会很大 ,要用long long
。。。
【代码】
/*
等价题意如下
给定N,Nic和Susan轮流将N整除2~9,第1个使N<=1的人赢。
Nic先手,问对于给定的N谁必胜。 */
#include <cstdio> long long n; int main()
{
scanf("%lld", &n);
long long i = 9; //一开始i == 9然后小于9就是先手胜
int b = 1;
while (b != 2) //这个条件是不可能实现的 。所以就一直循环。
{
if (n <= i) //如果在我们找到的规律区间里就输出相应的答案 然后结束循环
{
if (b == 1)
printf("Nic\n");
else
printf("Susan\n");
break;
}
if (b == 1) //如果现在是先手胜的区间那么就直接*2
i = i * 2;
else //否则乘9;
i = i * 9;
b = 1 - b;
}
return 0;
}

【u206】最大赢家的更多相关文章

  1. iFace Chain [ 爱妃链 ] 或将凭借人脸密钥技术成为安全领域最大的赢家

    前段时间iFace Chain [ 中文音译名称: 爱妃链 ] 安全专家揭密了区块链领域,数字资产存放于无信用钱包中的一些风险,并为区块链玩家解密如何安全保护资产私钥,我们再来回顾分析一下目前跑路钱包 ...

  2. [Swift]LeetCode486. 预测赢家 | Predict the Winner

    Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...

  3. L1-055 谁是赢家

    某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定.规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出:或艺人的观 ...

  4. leetcode 486 预测赢家

    题目描述 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,--.每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没 ...

  5. 少女花海自拍撞亡:自拍PK火车速度,没有赢家

    心理学研究,自拍是一种自我强化的过程.人们都或多或少有着自我关注的倾向,即“自恋”.而人作为有思想的群体性社会动物,有着分享和交流的欲望.尤其是现代快节奏的生活常使人感觉“亚历山大”,自拍恰恰就成为释 ...

  6. 3D打印浪潮中的赢家与输家

    3D打印浪潮中的赢家与输家 微博 空间 微信 新浪微博 邮箱 QQ好友 人人网 开心网 [导读]虽然目前3D打印行业规模不大且比较分散,但相关上市公司数量惊人.最大的两家是Stratasys和3D S ...

  7. 486 Predict the Winner 预测赢家

    给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没有剩余分数 ...

  8. YTU 2553: 谁是赢家

    2553: 谁是赢家 时间限制: 1 Sec  内存限制: 128 MB 提交: 94  解决: 25 题目描述 某一天,hcbbt等一群弱菜去tamara巨巨家里一起玩了一个卡牌游戏.巨 巨家里有2 ...

  9. 每日一题-——LeetCode(486) 预测赢家

    题目描述: 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,…….每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到 ...

随机推荐

  1. LiveReload配置,安装使用方法~~~前端页面神助手

    一.Chrome端安装LiveReload插件 1.首先这里啰嗦一下,如果Chrome无法进入商店,可以先安装一下谷歌商店助手 谷歌商店插件地址 http://pan.baidu.com/s/1dF1 ...

  2. spring+mybatis+Atomikos JTA事务配置说明

    一.概览 Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品.产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTrans ...

  3. Android JNI用于驱动測试

    硬件平台:S3C6410 操作系统:Ubuntu.windows 板子系统:Android 开发工具:jdk.ndk,eclipse 本次測试从linux内核模块编译開始.以S3C6410的pwm驱动 ...

  4. 学习活动管理系统:LAMS

    学习活动管理系统:LAMS 一.总结 基于java的cms 二.LAMS Learning Activity Management System,学习活动管理系统. 数字化学习已经具有完整的发展方法来 ...

  5. Java – Reading a Large File Efficiently--转

    原文地址:http://www.baeldung.com/java-read-lines-large-file 1. Overview This tutorial will show how to r ...

  6. js原生代码实现鼠标拖拽(超简单)

    首先先来看这一张图 在这种图中,盒子的大小为512px,并且margin-left:-250px margin-top:140px;并通过一些样式让其在中部显示 这些样式都不是重要的,这里加个marg ...

  7. GO语言学习(十四)Go 语言数组

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

  8. 字符串中的空格替换问题(Java版)

    解决方式一:时间复杂度为O(n^2) 解决方式二:时间复杂度为O(n) 代码实现: package string; public class SpaceStringReplace2 { //len为数 ...

  9. 微信支付v2开发(5) 订单查询

    本文介绍微信支付中订单查询功能的实现. 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一.订单查询 因为某一方 ...

  10. postman和fiddler的基本使用

    本文转自:https://www.cnblogs.com/qq909283/p/6826578.html 写在前面:本文主要的章节规划: 1.什么是接口测试 另外,有的时候会直接调用别的公司的接口,比 ...