POJ2975 & ZOJ3067 Nim [基础Nim博弈]输出方法
2013-04-29 15:52
381 查看
题目链接:poj zoj
题意:有 N 堆石子,两人轮流从任一堆中取任意个石子(至少一个),最后一个取石子的人为胜利者。若先取者胜利,则输出第一次拿走石头的方法一共可以有多少种。
分析:
求出一个必胜局面有多少种方式可以导出必败局面.
也就是求由S态到T态有多少种路径.
一个S态要转化成为T态,
令C = k1^k2^k3...^kn.
C的二进制表示最高位为1.
假设ki的二进制表示最高位与C的二进制表示最高位相同,那么可以通过将ki的某些二进制位上的0置为1,1置为0来使得C' = 0,也就是使S态转化为T态.
所以问题就是寻找有多少个ki,其最高位和C的最高位相同.
代码:
题意:有 N 堆石子,两人轮流从任一堆中取任意个石子(至少一个),最后一个取石子的人为胜利者。若先取者胜利,则输出第一次拿走石头的方法一共可以有多少种。
分析:
求出一个必胜局面有多少种方式可以导出必败局面.
也就是求由S态到T态有多少种路径.
一个S态要转化成为T态,
令C = k1^k2^k3...^kn.
C的二进制表示最高位为1.
假设ki的二进制表示最高位与C的二进制表示最高位相同,那么可以通过将ki的某些二进制位上的0置为1,1置为0来使得C' = 0,也就是使S态转化为T态.
所以问题就是寻找有多少个ki,其最高位和C的最高位相同.
代码:
#include <iostream> #include <cstdio> using namespace std; int main() { int n; while (scanf("%d", &n), n) { int stone[1001], ans = 0, i; for (i=0; i<n; i++) { scanf("%d", &stone[i]); ans ^= stone[i]; } int total = 0; for (i=0; i<n; i++) { if (stone[i] > (stone[i]^ans)) total ++; } printf("%d\n", total); } return 0; }
相关文章推荐
- hdu 1907 John&& hdu 2509 Be the Winner(基础nim博弈)
- 【习题&基础知识】输入与输出、简单循环(好多图贴上去好累...要看图的话我把word文档发给你)
- poj2975 Nim 博弈
- Struts2框架调试时,控制台打印输出大量<mime-mapping>相关信息,解决方法
- poj2975 Nim(经典博弈)
- iOS基础控件-UITabBarController - 3 之<UITabBarControllerDelegate>协议中的四个重要方法
- HDU 1850 Being a Good Boy in Spring Festival 基础Nim博弈
- ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)
- 博弈之 Nim 游戏&poj 3537 Crosses and Crosses
- hdu1525 Euclid's Game , 基础博弈
- jion方法(合并某个线程) jion()调用优先级别,把"谢霆锋"调到前面输出
- Java基础--->09.关于JDK使用旧方法编译出错、警告问题。
- c++ 实现顺序栈类(初始化,入栈,退栈。读栈顶元素以及顺序输出栈顶指针与栈中的元素<<计算机软件技术基础 徐士良>>
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
- SQL Server XML基础学习之<6>--XQuery的 value() 方法、 exist() 方法 和 nodes() 方法
- Java基础回顾: "=="和equals()方法的区别
- ACM基础之三种输出类型及常见实现方法
- XSLT中&nbsp;的输出方法
- [POJ2975] Nim(Nim游戏,博弈)
- XML1.0基础 输出特殊字符 & < > " '