Hdu 1729 Nim博弈
之前没做过这题,因为学弟问到我如果来求该题的sg值,才做了这题。
首先, 是多堆Nim博弈毫无疑问,这题是往一个有固定容量的箱子里放石子,和从一堆石子里面拿出石子是一个道理。
和传统的Nim稍有不同的地方是:The number mustn’t be great than the square of the number of stones before the player adds the stones.
也就是说,往箱子里放石子的数量应该在1... c^2,当然也应该使放完石子之后箱子里总的石子个数小于S(箱子的容量)。这里,很自然的会想到比较c^2和s-c的大小,s-c是箱子此时剩余的容量,而c^2是可以放的最大的容量(前提是c^2 <= s-c).
所以,如果 c^2 >= s-c ,也就是说此时可以往箱子里放 1...s-c个石子,也就是一个单堆的Nim博弈,所以sg(x) = x。
但是如果 c^2 < s-c, 那么只需要找一个临界的情况,就是 t^2 < s - t 而且 (t+1)^2 >= s - (t+1).这里t是指箱子里当前石子的个数,这里的t是距离终态s最近的一个必败点,终态为s,是因为如果箱子里已经有了s个石子,那么就不可以再往箱子里放石子,所以这个状态是必败态,即sg(s) = 0. 那为什么t状态是必败点呢? 因为从 t+1, t+2, t+3...s-1都可以直接转移到s态,理由就是 (t+1)^2 >= s - (t+1). (能转移到必败点的状态都是必胜态)。所以t状态是距离终态s最近的必败点,也就是说sg(t) = 0。如果, c = t,那么直接返回0, 如果 c > t,那么直接返回sg值,sg(c) = s - c. (因为 sg(s)=0, sg(s-1) = s-1....别忘了单堆Nim的sg(x) = x)。而如果 c < t,那么只需要递归来求sg(c)。道理和上面一样。
附上代码:
/*************************************************************************
> File Name: 1729.cpp
> Author: Stomach_ache
> Mail: sudaweitong@gmail.com
> Created Time: 2014年04月25日 星期五 11时25分34秒
> Propose:
************************************************************************/ #include <cmath>
#include <string>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long LL; LL
get_sg(int s, int c) {
int t = int(sqrt(s+0.0));
while (t*t+t >= s)
t--;
// t+1, t+2 ... s-1 都是必胜态,因为s是必败态,而他们都可以转移到s
if (c > t) return s - c;
if (c == t) return ;
return get_sg(t, c);
} int
main(void) {
int n, cnt = ;
while (~scanf("%d", &n) && n) {
LL ans = ;
for (int i = ; i < n; i++) {
int s, c;
scanf("%d %d", &s, &c);
if (c == ) continue;
if ((LL)c * c >= s - c) {
ans ^= (s - c);
} else {
ans ^= get_sg(s, c);
}
} printf("Case %d:\n", cnt++);
if (ans) {
puts("Yes");
} else {
puts("No");
}
} return ;
}
Hdu 1729 Nim博弈的更多相关文章
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- hdu 1730 Nim博弈
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1730 Nim博弈为:n堆石子,每个人可以在任意一堆中取任意数量的石子 n个数异或值为0就后手赢,否则先 ...
- HDU - 1850 Nim博弈
思路:可以对任意一堆牌进行操作,根据Nim博弈定理--所有堆的数量异或值为0就是P态,否则为N态,那么直接对某堆牌操作能让所有牌异或值为0即可,首先求得所有牌堆的异或值,然后枚举每一堆,用已经得到的异 ...
- hdu 1907(Nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- HDU 3032 (Nim博弈变形) Nim or not Nim?
博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆化搜索的方式打个表,规律就相当 ...
- HDU 3389 (Nim博弈变形) Game
参考了众巨巨的博客,现在重新整理一下自己的思路. 首先在纸上画了一下转移图: 1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中 ...
- HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival
考虑到Bouton定理的证明过程,设n个数的Nim和(异或和)为X,其最高位的1在第k位,那么n个数中一定有个y的第k为也是个1. 将y的数量变为X xor y,那么n的数的Nim和为0,便转为先手必 ...
- HDU 2509 nim博弈
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
随机推荐
- PAT甲级——A1023 Have Fun with Numbers
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...
- 移动端自动化测试Appium 从入门到项目实战Python版
移动端自动化测试Appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- [转]C#改变无边框窗体大小
#region 改变窗体大小 const int WM_NCHITTEST = 0x0084; ; //左边界 ; //右边界 ; //上边界 ; //左上角 ; //右上角 ; //下边界 cons ...
- 如何让 J2Cache 在多种编程语言环境中使用
现在的系统是越来越复杂了,不仅仅是功能复杂,系统结构也非常复杂,而且经常在一个系统里包含几种不同语言编写的子系统.例如用 JavaScript 做前端开发.用 Java/PHP 等等做后端,C/C++ ...
- TZ_14_Zuul网关_过滤器
1.Zuul作为网关的其中一个重要功能,就是实现请求的鉴权.而这个动作我们往往是通过Zuul提供的过滤器来实现的. 2.自定义过滤器实现用户登陆时需要携带一个Key才可以登陆,否则返回403 1> ...
- Hackerrank--Prime Sum
题目链接 The problem is quite simple. You're given a number N and a positive integer K. Tell if N can be ...
- poj 1679 The Unique MST 判断最小生成树是否唯一(图论)
借用的是Kruskal的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...
- MyEclipse使用总结——MyEclipse10.6 下添加jadClipse反编译插件[转]
jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到MyEclipse10.X,9.X,8.X,6.X等各版 ...
- Redis数据库在ubuntu16.04下的安装
1.安装 sudo apt-get install redis-server 2.启动 sudo service redis-server start 3.查看 ps aux|grep redis 4 ...
- P3303 [SDOI2013]淘金
题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...