来源为今年的华为面试题,第二题。
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出'2'.先取者胜输出'1'.
Input
输入有多组.每组第1行是2<=n<2^31. n=0退出.
例子:输入3,输出2
【分析】
首先进行基本的分析,要不让后取者一次取完剩余所有的,先取者一次最多取剩余数-1的的1/3,即先取数<(n-1)/3
然后进行枚举推导
n =3时,先取者只能取1,输出“2”
n=4时,先取者取1,此时角色转换,后取者变成先取者,剩下石子数为3,此时的后取者,也就是最初的先取者必定获胜,故输出'1'
n=5 先取数<=1,取1,演变成上述n=4的情况,输出'2'
n=6 先取数<=1,取1,输出'1'
n=7
先取数可取1或是2,若先取者取1,则输出'2',若先取者取2,则输出'1',既然存在能获胜的情况,先取者当然会选择能让自己获胜的取法(前提),故输出'1'
n=8时,先取者可取1或是2,若取1,n=7,输出'2',若取2,n=6,也是输出2,故结果为'2'
n=9-11时,先取者分别可取1,2,3,使n=8,来达到获胜的条件
n=12时,先取者取1,从而限定了后取者只能取1和2两种情况,后取者此时无论取1还是2,先取者都可以对应的取2或是1,来达到n=8时后取者和先取者的角色转换,从而获胜。
n=13时,先取者可取1,2,3,4,达不到n=8,先取者必然负。
......
ps:本人在作答时,简单的考虑到了先取数<(
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出'2'.先取者胜输出'1'.
Input
输入有多组.每组第1行是2<=n<2^31. n=0退出.
例子:输入3,输出2
【分析】
首先进行基本的分析,要不让后取者一次取完剩余所有的,先取者一次最多取剩余数-1的的1/3,即先取数<(n-1)/3
然后进行枚举推导
n =3时,先取者只能取1,输出“2”
n=4时,先取者取1,此时角色转换,后取者变成先取者,剩下石子数为3,此时的后取者,也就是最初的先取者必定获胜,故输出'1'
n=5
n=6
n=7
n=8时,先取者可取1或是2,若取1,n=7,输出'2',若取2,n=6,也是输出2,故结果为'2'
n=9-11时,先取者分别可取1,2,3,使n=8,来达到获胜的条件
n=12时,先取者取1,从而限定了后取者只能取1和2两种情况,后取者此时无论取1还是2,先取者都可以对应的取2或是1,来达到n=8时后取者和先取者的角色转换,从而获胜。
n=13时,先取者可取1,2,3,4,达不到n=8,先取者必然负。
......
ps:本人在作答时,简单的考虑到了先取数<(
