博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nyoj 135 取石子(二) 【NIM】
阅读量:4963 次
发布时间:2019-06-12

本文共 898 字,大约阅读时间需要 2 分钟。

取石子(二)

时间限制:
3000 ms  |  内存限制:
65535 KB
难度:
5
描写叙述

小王喜欢与同事玩一些小游戏。今天他们选择了玩取石子。

游戏规则例如以下:共同拥有N堆石子。已知每堆中石子的数量。而且规定好每堆石子最多能够取的石子数(最少取1颗)。

两个人轮流取子。每次仅仅能选择N堆石子中的一堆,取一定数量的石子(最少取一个),而且取的石子数量不能多于该堆石子规定好的最多取子数。等哪个人无法取子时就表示此人输掉了游戏。

如果每次都是小王先取石子,而且游戏两方都绝对聪明,如今给你石子的堆数、每堆石子的数量和每堆石子规定的单次取子上限,请推断出小王是否能获胜。

输入
第一行是一个整数T表示測试数据的组数(T<100)
每组測试数据的第一行是一个整数N(1<N<100),表示共同拥有N堆石子,随后的N行每行表示一堆石子。这N行中每行有两个数整数m,n表示该堆石子共同拥有m个石子,该堆石子每次最多取n个。(0<=m,n<=2^31)
输出
对于每组測试数据,输出Win表示小王能够获胜,输出Lose表示小王必定会败。
例子输入
211000 121 11 1
例子输出
LoseLose
提示
注意以下一组測试数据
2
1 1 
2 2
正确的结果应该是Win
由于小王会先从第二堆石子中取一个石子,使状态变为
1 1
1 2
这样的状态下,不管对方怎么取,小王都能获胜。

nim博弈+巴什

代码:

/*nim*/#include 
int main(){ int t, n; scanf("%d", &t); while(t --){ scanf("%d", &n); int ans = 0,a, k; while(n --){ scanf("%d%d", &a, &k); a%=(k+1); ans^=a; } printf("%s\n", ans?

"Win":"Lose"); } return 0; }

转载于:https://www.cnblogs.com/gcczhongduan/p/5275235.html

你可能感兴趣的文章
.NET同一个页面父容器与子容器通信方案
查看>>
苹果开发——App内购以及验证store的收据(二)
查看>>
学习计划大纲
查看>>
uml中顺序图创建
查看>>
简单修改cramfs
查看>>
sql中批量删除带有外键的所有表
查看>>
o(1)取b > a,且b的二进制中1的个数等于a二进制中1的个数,且使b最小
查看>>
【iOS Programming: The Big Nerd Ranch Guide】【笔记】2
查看>>
Codeforces Round #263 (Div. 2)
查看>>
Codeforces Round #278 (Div. 2)
查看>>
Leetcode:Maximal Rectangle
查看>>
Ubuntu搭建FTP server
查看>>
IOS学习笔记 -- 基础-疯狂猜图实现流程
查看>>
045邹汉辉
查看>>
C#三种字符串拼接方法的效率对比
查看>>
Sublime Text 3中文乱码解决方法以及安装包管理器方法
查看>>
python之md5模块
查看>>
对xml文件封装思想的处理
查看>>
DIV垂直/水平居中2(DIV宽度和高度是动态的)
查看>>
身份证号码升级
查看>>