点击打开题目链接

之前没做过这题,因为学弟问到我如果来求该题的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)。道理和上面一样。

附上代码:

  1. /*************************************************************************
  2. > File Name: 1729.cpp
  3. > Author: Stomach_ache
  4. > Mail: sudaweitong@gmail.com
  5. > Created Time: 2014年04月25日 星期五 11时25分34秒
  6. > Propose:
  7. ************************************************************************/
  8.  
  9. #include <cmath>
  10. #include <string>
  11. #include <cstdio>
  12. #include <fstream>
  13. #include <cstring>
  14. #include <iostream>
  15. #include <algorithm>
  16. using namespace std;
  17.  
  18. typedef long long LL;
  19.  
  20. LL
  21. get_sg(int s, int c) {
  22. int t = int(sqrt(s+0.0));
  23. while (t*t+t >= s)
  24. t--;
  25. // t+1, t+2 ... s-1 都是必胜态,因为s是必败态,而他们都可以转移到s
  26. if (c > t) return s - c;
  27. if (c == t) return ;
  28. return get_sg(t, c);
  29. }
  30.  
  31. int
  32. main(void) {
  33. int n, cnt = ;
  34. while (~scanf("%d", &n) && n) {
  35. LL ans = ;
  36. for (int i = ; i < n; i++) {
  37. int s, c;
  38. scanf("%d %d", &s, &c);
  39. if (c == ) continue;
  40. if ((LL)c * c >= s - c) {
  41. ans ^= (s - c);
  42. } else {
  43. ans ^= get_sg(s, c);
  44. }
  45. }
  46.  
  47. printf("Case %d:\n", cnt++);
  48. if (ans) {
  49. puts("Yes");
  50. } else {
  51. puts("No");
  52. }
  53. }
  54.  
  55. return ;
  56. }

Hdu 1729 Nim博弈的更多相关文章

  1. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...

  2. HDU 1907 Nim博弈变形

    1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...

  3. hdu 1730 Nim博弈

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1730 Nim博弈为:n堆石子,每个人可以在任意一堆中取任意数量的石子 n个数异或值为0就后手赢,否则先 ...

  4. HDU - 1850 Nim博弈

    思路:可以对任意一堆牌进行操作,根据Nim博弈定理--所有堆的数量异或值为0就是P态,否则为N态,那么直接对某堆牌操作能让所有牌异或值为0即可,首先求得所有牌堆的异或值,然后枚举每一堆,用已经得到的异 ...

  5. hdu 1907(Nim博弈)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  6. HDU 3032 (Nim博弈变形) Nim or not Nim?

    博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆化搜索的方式打个表,规律就相当 ...

  7. HDU 3389 (Nim博弈变形) Game

    参考了众巨巨的博客,现在重新整理一下自己的思路. 首先在纸上画了一下转移图: 1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中 ...

  8. 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,便转为先手必 ...

  9. HDU 2509 nim博弈

    Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. Spring AOP(一)--基本概念

    AOP(Aspect Oriented Programing),意为面向切面编程,其实看了很多书本的介绍和说明,我觉得这些解释都太过书面,也可能是翻译的原因,总觉得还是不太懂,也难以理解这种叫法,尤其 ...

  2. vue 路由入门(vue-router)

    新建的 js 文件如下: import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //全局使用该组件 / ...

  3. 关于node中 require 和 ES6中export 、export default的总结

    nodejs中 require 方法的加载规则 方法的加载规则 1. 优先从缓存中加载 2. 核心模块 3. 路径形式的模块 4. 第三方模块 一.优先从缓存中加载 main.js:执行加载a.js模 ...

  4. Django运行错误常见问题及解决方法1

    如果不是在JetBrains PyCharm 2017.2里创建的想在JetBrains PyCharm 2017.2里运行.可以在   编辑结构  进行配置正常使用

  5. CF549G Happy Line

    传送门 解题思路 题意大概就是给你个数列,你可以随意交换i,i+1,交换后位于第i+1位的数字+1,位于第i位的数字-1,问最终能否形成一个不下降序列并输出.设初始数列中两个位置x,y最终交换后的位置 ...

  6. nginx的四个基本功能

    Nginx能做什么 1.反向代理2.负载均衡3.HTTP服务器(包含动静分离)4.正向代理 以上就是做网站小编了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做 1.反向代理 ...

  7. 通过ajax从jsp页面传输数据到web层,并从web层返回数据给jsp页面

    jsp中ajax代码: 1 $.ajax({ var id = $("#studentid").val();//获取标签中的学生id url:'${pageContext.requ ...

  8. SpringCloud微服务实战一:Spring Cloud Eureka 服务发现与注册中心(高可用实列为两个注册中心)

    微服务架构: 微服务架构的核心思想是,一个应用是由多个小的.相互独立的.微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖.不同服务通过一些轻量级交互机制来通信,例如 RPC.HTTP 等, ...

  9. day18 15.自定义连接池

    我们写的是连接池吗?Connection对象绝对不能关.现在写的玩意不是连接池.因为现在讲的是JDBC,连接池也是JDBC里面的,人家那是SUN公司定义的标准.标准,你那不是标准.既然是标准,你做连接 ...

  10. Vue.js NPM 安装方法

    由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命令 cnpm,安装使用介绍参照:使用淘宝 NPM 镜像. npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 $ npm -v ...