由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 火柴问题
相关主题
probably XOR problem一道面试题
压马僧面对面问道题
怎么找一个数组里面,出现次数是偶数的数?也来说道题
请问一道题:leetcode 416题的扩展问一个关于xor的题
15根火柴俩人轮流去,一次1-3根,最后总数为奇数的赢,怎搞?前段时间整理的随机算法
游戏公司基本上挂了请教一道题目
问一个想了12年没想出来的问题Amazon 电面经历
应该是考过很多的题,请知道的简单说下或给个LINK。BOW简短面经(amazon第一轮电面)
相关话题的讨论汇总
话题: xor话题: 定理话题: t2话题: s2话题: t0
进入JobHunting版参与讨论
1 (共1页)
g***s
发帖数: 3811
1
题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
1比较容易,2难一些.
g**e
发帖数: 6127
2
第一题先取的人必胜,只要每次都把一堆留下两根,剩下的都拿走。不管第二个人怎么
拿,都有必胜的办法。
第二题还没想特别清楚,感觉如果是奇数堆火柴,先拿取胜。偶数堆就是后拿取胜

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

g***s
发帖数: 3811
3
只能从"一堆"中取

【在 g**e 的大作中提到】
: 第一题先取的人必胜,只要每次都把一堆留下两根,剩下的都拿走。不管第二个人怎么
: 拿,都有必胜的办法。
: 第二题还没想特别清楚,感觉如果是奇数堆火柴,先拿取胜。偶数堆就是后拿取胜
:
: ,可

g**e
发帖数: 6127
4
不是有若干堆吗,你的意思是一堆没取完,不能动下一堆?

【在 g***s 的大作中提到】
: 只能从"一堆"中取
g***s
发帖数: 3811
5
一次从两堆里取

【在 g**e 的大作中提到】
: 不是有若干堆吗,你的意思是一堆没取完,不能动下一堆?
A***M
发帖数: 18
6
1是比较简单。异或所有堆的数目。每次从某堆取一些, 使这个异或值为0。
2也类似吧。 还在想。

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

g**********y
发帖数: 14569
b**********r
发帖数: 91
8
nim number problem. (1) make all nums xor equals to 0 (2) make all nums xor
equals to 1

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

g**e
发帖数: 6127
9
各位大牛都太厉害了

【在 g**********y 的大作中提到】
: http://en.wikipedia.org/wiki/Nim
g**********y
发帖数: 14569
10
我是后知后觉 + 偷懒 + 问人 + Google,Bravethinker是博学

【在 g**e 的大作中提到】
: 各位大牛都太厉害了
相关主题
游戏公司基本上挂了一道面试题
问一个想了12年没想出来的问题问道题
应该是考过很多的题,请知道的简单说下或给个LINK。BOW也来说道题
进入JobHunting版参与讨论
r*******y
发帖数: 1081
11
consider the simple case firstly ?

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

g***s
发帖数: 3811
12
2不对。
比如 3 3 3 3

xor

【在 b**********r 的大作中提到】
: nim number problem. (1) make all nums xor equals to 0 (2) make all nums xor
: equals to 1
:
: ,可

g***s
发帖数: 3811
13
这个只给了1的解答。1是比较容易的。

【在 g**********y 的大作中提到】
: http://en.wikipedia.org/wiki/Nim
g**********y
发帖数: 14569
14
3 3 3 3想起来比较抽象,{3,2}就可以。
按XOR=1, player 1该取成{1, 2}, 但是player 2把2取走,player 1就必胜了。

【在 g***s 的大作中提到】
: 2不对。
: 比如 3 3 3 3
:
: xor

g***s
发帖数: 3811
15
我是说3 3 3 3 按这个方法不对。
3 3 3 3实际是必败的一个状态.

【在 g**********y 的大作中提到】
: 3 3 3 3想起来比较抽象,{3,2}就可以。
: 按XOR=1, player 1该取成{1, 2}, 但是player 2把2取走,player 1就必胜了。

g**e
发帖数: 6127
16
偶数堆先拿必败吧,我感觉

【在 g***s 的大作中提到】
: 我是说3 3 3 3 按这个方法不对。
: 3 3 3 3实际是必败的一个状态.

g***s
发帖数: 3811
17
不一定。例如3 1 1 1 或者1 1

【在 g**e 的大作中提到】
: 偶数堆先拿必败吧,我感觉
g**e
发帖数: 6127
18
1 1 怎么不是先拿必败?第一个人只能拿一根,第二个人就赢了
是不是我理解错了第二题意?

【在 g***s 的大作中提到】
: 不一定。例如3 1 1 1 或者1 1
g***s
发帖数: 3811
19
取到最后一根的败啊

【在 g**e 的大作中提到】
: 1 1 怎么不是先拿必败?第一个人只能拿一根,第二个人就赢了
: 是不是我理解错了第二题意?

g***s
发帖数: 3811
20
这是大学算法课的一个作业。后来发到了学校的bbs上,刚刚查了一下,居然有人放到
blog里面了。
http://blog.163.com/gditacmfeng@yeah/blog/static/13702062420100
先解决第1题
定义1:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,为利己
态,用S表示。
定理1:对任何S态,存在方法,从其中取一堆中的若干根,使状态变为T态。
引理1.1 :A(i)为非副整数,i=1..n, 记c=A(1) xor A(2) xor …… xor A(n),若c>0
,则存在A(t), A(t) xor c 证明: 把c表示成二进制,记它的二进制数的最高位为第p位,则必然存在一个A(t),它
二进制的第p位也是1。(否则,若所有的A(i)的第p位都是0,c的第p位就也为0,矛盾
!)
x=a(t) xor c 的第p位将为1 xor 1,即0;
又因为c的最高位为p,所以x高于p位的值不变。所以必有x . 命题得证。
再来证定理1.
证明:
设共有n堆火柴,每堆的数目分别为A(i),i=1..n,A(i)为非副整数.
记c=A(1) xor A(2) xor …… xor A(n),
因为是S态,所以 c>0;
所以存在A(t), A(t) xor c A(t)' = A(t) xor c c' = A(1) xor A(2) xor … xor A(t)' xor … xor A(n)
= A(1) xor A(2) xor … xor A(t) xor c xor … xor A(n)
= A(1) xor A(2) xor … xor A(t) xor … xor A(n) xor c
= c xor c = 0
所以,用把第t堆由A(t)根取成A(t)' 根(A(t)' = A(t) xor c 故命题成立。 #
定理2:T态,取任何一堆的若干根,都将成为S态。
证明:反证法:
反设存在一堆,记为第m堆,从中取了若干根,根数由A(m)变为A(m)' .
A(m)>A(m)' 状态均为T态。
记c=A(1) xor A(2) xor … xor A(m) xor… xor A(n),
记c'=A(1) xor A(2) xor … xor A(m)' xor… xor A(n),
c=0;c'=0;
所以有 0= A(1) xor A(2) xor … xor A(m) xor… xor A(n)
= A(1) xor A(2) xor … xor A(m-1) xor A(m+1) xor… xor A(n) xor A(m)
= d xor A(m)
d= A(1) xor A(2) xor … xor A(m-1) xor A(m+1) xor… xor A(n)
故 A(m)=d
同理, d xor A(m)' =0
A(m)'= d
所以,A(m)'=A(m) . 矛盾!
故反设不成立。原命题成立。 #
定理 3:S态,只要方法正确,必赢。
最终胜利即由S态转变为T态,任何一个S态,只要把它变为T态,(由定理一,可以把它
变成T态。)对方只能把T态转变为S态(定理2)。这样,所有S态向T态的转变都可以有己
方控制,对方只能被动地实现由T态转变为S态。故S态必赢。 #
定理4:T态,只要对方法正确,必败。
由定理3易得。
我们再来处理第2题。我们会发现两题会有一些相同之处,控制S->T态的人控制着主动权
。经过分析,我们有以下结论:
定义2:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。
定义3:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的
堆数等于0,则称为部分利他态,用T0表示。
定理4:不存在充裕堆数为1的T态。
证明:
孤单堆的根数异或只会影响二进制的最后一位,但充裕堆会影响高位(非最后一位)。
一个充裕堆,高位必有一位不为0,则所有根数异或不为0。故不会是T态。
定义4:S态中,若充裕堆的堆数大于等于2,则称为完全利己态,用S2表示;若充裕堆的
堆数等于1,则称为自主利己态,用S1表示; 若充裕堆的堆数等于0,则称为部分利己态
,用S0表示。
定理4:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
证明:S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对方取
,所以最后一根必己取。败。
同理, T0态必胜#
定理5:S1态,只要方法正确,必胜。
证明:若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。
这样,就变成奇数个孤单堆,由对方取。
由定理4,对方必输。己必胜。 #
定理6:S2态不可转一次变为T0态。
证明:充裕堆数不可能一次由2变为0。得证。 #
定理7:S2态可一次转变为T2态。
证明:由定理1,S态可转变为T态,态可一次转变为T态
又由定理6,S2态不可转一次变为T0态,
所以转变的T态为T2态。 #
定理8:T2态,只能转变为S2态或S1态。
证明:. 由定理2,T态必然变为S态。
由于充裕堆数不可能一次由2变为0,所以此时的S态不可能为S0态。
命题得证。
定理9:S2态,只要方法正确,必胜.
证明:方法如下:
1) S2态,就把它变为T2态。(由定理7)
2) 对方只能T2转变成S2态或S1态(定理8)
若转变为S2, 转向1)
若转变为S1, 这己必胜。(定理5)
定理10:T2态必输。
证明:同9。
综上所述,必输态有: T2,S0
必胜态: S2,S1,T0.
两题比较:
第一题的全过程其实如下:
S2->T2->S2->T2-> …… ->T2->S1->T0->S0->T0->……->S0->T0(全0)
第二题的全过程其实如下:
S2->T2->S2->T2-> …… ->T2->S1->S0->T0->S0->……->S0->T0(全0)
下划线表示胜利一方的取法。
是否发现了他们的惊人相似之处。
我们不难发现(见加黑部分),S1态可以转变为S0态(第二题做法),也可以转变为T0(
第一题做法)。哪一方控制了S1态,他即可以有办法使自己得到最后一根(转变为T0)
,也可以使对方得到最后一根(转变为S0)。
所以,抢夺S1是制胜的关键!
为此,始终把T2态让给对方,将使对方处于被动状态,他早晚将把状态变为S1.(见定
理9的证明).
相关主题
问一个关于xor的题Amazon 电面经历
前段时间整理的随机算法简短面经(amazon第一轮电面)
请教一道题目一个经典题
进入JobHunting版参与讨论
g**********y
发帖数: 14569
21
如果没有见过解法,面试时就解出来,也太牛了。我是慢慢想都只能解特殊情况。不知道什么时候能全解。

>0

【在 g***s 的大作中提到】
: 这是大学算法课的一个作业。后来发到了学校的bbs上,刚刚查了一下,居然有人放到
: blog里面了。
: http://blog.163.com/gditacmfeng@yeah/blog/static/13702062420100
: 先解决第1题
: 定义1:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,为利己
: 态,用S表示。
: 定理1:对任何S态,存在方法,从其中取一堆中的若干根,使状态变为T态。
: 引理1.1 :A(i)为非副整数,i=1..n, 记c=A(1) xor A(2) xor …… xor A(n),若c>0
: ,则存在A(t), A(t) xor c : 证明: 把c表示成二进制,记它的二进制数的最高位为第p位,则必然存在一个A(t),它

g***s
发帖数: 3811
22
这个做面试题太难。是一道课后选题,老师也没有答案的那种。

知道什么时候能全解。

【在 g**********y 的大作中提到】
: 如果没有见过解法,面试时就解出来,也太牛了。我是慢慢想都只能解特殊情况。不知道什么时候能全解。
:
: >0

d*******l
发帖数: 338
23
稍微难了点,自己真想不出来。。
s*****y
发帖数: 897
24
这个真是google得面试题阿
http://23.latest.careercup.appspot.com/question?id=174666

【在 g***s 的大作中提到】
: 这个做面试题太难。是一道课后选题,老师也没有答案的那种。
:
: 知道什么时候能全解。

F**r
发帖数: 84
25
game theory, simple DP, only 2 values for each state case, win or lose

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

g***s
发帖数: 3811
26
第一题做面试没问题,并不难。第二题做面试要现场做出来难。

【在 s*****y 的大作中提到】
: 这个真是google得面试题阿
: http://23.latest.careercup.appspot.com/question?id=174666

d**e
发帖数: 6098
27
看来现在的面试,数学差点都不行...

【在 g**********y 的大作中提到】
: http://en.wikipedia.org/wiki/Nim
b*******y
发帖数: 232
28
好像第二问就是留一根给对方就行了

,可

【在 g***s 的大作中提到】
: 题目1: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
: 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
: 题目2: 今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可
: 将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
: 1比较容易,2难一些.

N*2
发帖数: 95
29
拜托
人家明明给了1和2的答案
仔细看

【在 g***s 的大作中提到】
: 这个只给了1的解答。1是比较容易的。
g***s
发帖数: 3811
30
哦。不好意思,没看仔细。
呵呵。

【在 N*2 的大作中提到】
: 拜托
: 人家明明给了1和2的答案
: 仔细看

相关主题
贡献一道面试题目:找出在一个数组里面只出现1次的两个数字压马僧面对面
问个问题 求missing number怎么找一个数组里面,出现次数是偶数的数?
probably XOR problem请问一道题:leetcode 416题的扩展
进入JobHunting版参与讨论
g**********y
发帖数: 14569
31
赞知错就改!

【在 g***s 的大作中提到】
: 哦。不好意思,没看仔细。
: 呵呵。

1 (共1页)
进入JobHunting版参与讨论
相关主题
简短面经(amazon第一轮电面)15根火柴俩人轮流去,一次1-3根,最后总数为奇数的赢,怎搞?
一个经典题游戏公司基本上挂了
贡献一道面试题目:找出在一个数组里面只出现1次的两个数字问一个想了12年没想出来的问题
问个问题 求missing number应该是考过很多的题,请知道的简单说下或给个LINK。BOW
probably XOR problem一道面试题
压马僧面对面问道题
怎么找一个数组里面,出现次数是偶数的数?也来说道题
请问一道题:leetcode 416题的扩展问一个关于xor的题
相关话题的讨论汇总
话题: xor话题: 定理话题: t2话题: s2话题: t0