报数游戏2
来源:互联网 发布:windows server 哪个好 编辑:程序博客网 时间:2024/06/05 20:13
题目来源:
庞果网
题目简介:
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。
完整代码请见:
http://www.anycodex.com/blog/?p=90
- 报数游戏2
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏
- 报数游戏(2)--【英雄会】
- 报数游戏(约瑟夫环)
- 项目名称: 报数游戏
- B - 报数游戏
- 面向对象基础知识(5)- 封装 继承 多态
- Android照相功能驱动层中HAL的实现(基于OK6410开发板+OV9650摄像头)
- hdu 1217 && poj2240 Arbitrage 最短路
- Open .pdf on ubuntu
- NVelocity用法
- 报数游戏2
- 小P的故事——神奇的饭卡
- poj——2392——Space Elevator(多重)
- 国内一款不错的快递单号查询的API
- 【设计模式基础】行为模式 - 6 - 模板方法(Template Method)
- [树状数组]POJ 2299 Ultra-QuickSort
- 小P的故事——神奇的换零钱
- Longest Consecutive Sequence
- 数据结构上机实验之二分查找