具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; int bit[35]; void solve(int n) { int num=0; while(n) { n%2==1?bit[num]++:bit[num]; n/=2; num++; } } int main() { int n,x; scanf("%d",&n); memse…
以下笔记摘自计算机丛书组合数学,机械工业出版社. Nim取石子游戏 Nim(来自德语Nimm!,意为拿取)取石子游戏. 前言: 哇咔咔,让我们来追寻娱乐数学的组合数学起源! 游戏内容: 有两个玩家面对若干堆东西(硬币,石子,豆子···)进行游戏.设有k≥1堆硬币,各堆分别含有n1,n2...nk枚硬币. 游戏规则: (1):游戏中两个人交替进行游戏(我们称第一个取的为1号,第二个取的为2号). (2):当玩家取石子的时候,先选择硬币中的一堆,然后可以从堆中取走任意数量的硬币. 当所有的堆为空时,…
题目描述 Tweedle-Dee 和 Tweedle-Dum 正在进行一场激烈的二进制 Nim 游戏.这是你没有玩过的船新版本,游戏包含 N 个栈,每个栈只包含 0 和 1 的元素.就像一般的 Nim 游戏一样,两人轮流行动.玩家在一回合中,必须选择一个非空的栈,然后从栈顶取出至少一个元素.不过,Tweedle-Dee 只能从栈顶是 0 的栈中取出元素,而 Tweedle-Dum只能从栈顶是 1 的栈中取出元素.无法行动的玩家落败.Suzumo 懒得等游戏结束了.给定先手玩家,请求出谁会获胜.别…
吐泡泡题目链接:https://www.nowcoder.com/acm/contest/74/A 题目: 思路: 这种题目当初卡了我很久,今天早训时遇到一个一样得题,一眼就想到用栈模拟,就又回来把这题补了.这题很简单,看代码基本上就能看懂,就不解释了. 代码实现如下: #include <set> #include <map> #include <queue> #include <stack> #include <cmath> #include…
算法中心思想: 始终向非空队列进行入队操作 初始化时两个队列都为空,我们对q1进行入队操作 入栈: 只需执行其中一个队列入队操作即可, 具体操作哪一个队列,用一个标记变量标记 出栈流程图 代码实现 package hello; import java.util.*; public class TwoQueueOneStack<E> { private Queue<E> q1 = new LinkedList<>(); private Queue<E> q2…
17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏,有下面几点需要考虑: 1. 判断是否能赢hasWon函数是调用一次还是多次,如果是多次,我们可能为了优化而需要加入一些预处理. 2. 井字棋游戏通常是3x3的大小,我们是否想要实现NxN的大小? 3. 我们需要在代码紧凑,执行速度和代码清晰之间做出选择. #include <iostream> #…
17.5 The Came of Master Mind is played as follows: The computer has four slots, and each slot will contain a ball that is red (R), yellow (Y), green (C) or blue (B). For example, the computer might have RGGB (Slot # 1 is red, Slots #2 and #3 are gree…
主题链接:点击打开链接 意甲冠军: 特定n 下列n行,每一行2的数量u v 表达v礧:u,u+1,u+2···u+v-1 问先手必胜还是后手必胜 思路: 首先依据Nim的博弈结论 把全部数都异或一下,看结果是0还是非0 而这里由于数字太多所以想优化 那么事实上对于一个序列 u, u+1, u+2 ···· 显然 {4,5} {,6,7}, {8,9} 这样2个一组的异或结果就是1 那么仅仅须要把序列分组,分成{偶数,奇数} 然后Y一下. . #include<stdio.h> #include…
链接:http://poj.org/problem?id=2368 和前面差距还是很大啊囧 代码: k,a;main(i){,i=;i<=k/&&k%i;++i);k%i||(a=i-);printf("%d\n",a);} 短码之美那本书上面的这道题目的代码思路是对的,可是会TLE的. 可是ozy的代码还是那么短得可怕…
这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败:否则,先手必胜. 结论很简单,但是证明却不是特别容易.找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看太懂. 首先,证明要依赖一个邓肯多夫定理(Zeckendorf's Theorem):任何一个正整数一定能分解成若干个不重复且不相邻的斐波那契数之和. 首推维基百科上的英文证明,很严谨也能看懂,证明的过程中还用到了一条引理,但是很容易用数学归纳法证明,所以整个过程都是十分严谨的:http://en.…