Hdu 1729 Nim博弈
来源:互联网 发布:好看的网游小说知乎 编辑:程序博客网 时间:2024/05/18 15:08
点击打开题目链接
之前没做过这题,因为学弟问到我如果来求该题的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;LLget_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是必败态,而他们都可以转移到sif (c > t) return s - c;
if (c == t) return 0;
return get_sg(t, c);}intmain(void) {int n, cnt = 1;while (~scanf("%d", &n) && n) {LL ans = 0;for (int i = 0; i < n; i++) {int s, c;scanf("%d %d", &s, &c);if (c == 0) 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 0;}
- Hdu 1729 Nim博弈
- hdu 1850nim博弈
- hdu 1849 nim博弈
- Hdu 1730 Nim博弈
- nim博弈 hdu 1849
- hdu 1847 Nim博弈
- HDU 1850 NIM博弈
- HDU 1850 Nim博弈
- hdu 2176 nim博弈
- HDU 5996 Nim博弈
- hdu 3032 Nim or not Nim? 博弈
- HDU 5011 Game nim博弈
- hdu 5011 (nim博弈模版)
- HDU 1907 John Nim博弈
- HDU 5011 Game 【Nim博弈】
- HDU 1907 Nim博弈 John
- hdu 5011 nim博弈变形
- HDU 1907 John (Nim博弈)
- 【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册
- Codeforces #29 C. Mail Stamps
- linux下安装pcap qt使用pcap.h
- [HNOI2002]营业额统计(SplayTree)
- Ubuntu下android开发环境部署
- Hdu 1729 Nim博弈
- ok6410裸机开发启动程序模板
- FAT12文件系统之引导扇区结构
- rhel 6.5 本地源yum配置和第三方源配置
- VTK学习笔记:数据集之结构化点集
- CCD、COMS,数字摄像头和模拟摄像头
- hbase 之 presplit
- 嵌入式 内核启动流程小结
- 父类private方法不能被重写(覆盖)