题目来源:
庞果网
题目简介:
N个人(编号1-N),站成一排,进行报数游戏。报数过程可能进行很多轮,有如下规则: (1) 如果剩余人数不超过3个人,则游戏结束。 (2) 大家报数,然后留下报奇数的人从第一个人继续游戏,或者留下报偶数的人继续游戏。 重复如此(1)(2)两步骤,到游戏结束。 问:最终剩下的三人组有多少种情况?(注意是三人组,例如如果最后剩下2个或者1个人,不计入结果中)。 输入n, (0<n<=10000000) 输出最终结果。
解题思路:
我们试探性地取几个特定的值来帮助我们发现规律。显然当N = 1/2时,result = 0;N = 3时,result = 1;当N = 4时,result = 0; N = 5时,采用第一轮偶数淘汰的方法可最后剩下三人组,此时result = 1,以此类推。我们不难发现,采用偶数留下或者奇数留下的方法,总是把所有人分为两部分,其中一部分含有N/2个人,另外一部分含有N – N/2个人。若我们淘汰含有N/2个人的那一组,能剩下三人组的所有可能数即为N – N/2个人中能剩下三人组的所有可能种数;反之我们如果留下N/2人组,淘汰N – N/2人组,那么剩下三人组所有可能种数即为N/2个人中能剩下三人组的可能种数。根据这种分析,我们很清楚的知道这个问题可以化为一个递归问题,而递归的公式为f(N) = f(N/2) + f(N-N/2)。
举例说明:
当N = 10时,这10个人依次报数为1.2.3.4.5.6.7.8.9.10
若我们淘汰奇数位的同学,则剩下2.4.6.8.10这五位同学。这五位同学重新报数1 2 3 4 5,根据前面的分析结果我们可知此时剩下三人组的可能种数为1种;
同样若我们淘汰偶数位的同学,则剩下1.3.5.7.9这五位同学,剩下三人组的可能种数也为1种;
综上所述,当N=10时,result = 1+1=2。
完整代码请见: