盒子游戏
2015-11-29 15:14
253 查看
题目描述
有两个相同的盒子,其中一个装了n个球,另一个装了一个球。Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后清空这个盒子(盒子里的球直接扔掉),然后把另一个盒子里的球拿一些到这个盒子中,使得两个盒子都至少有一个球。如果一个游戏者无法进行操作,他(她)就输了。下图是一个典型的游戏:![](https://ac.2333.moe/res/image/20120508/20120508181133_89181.png)
面对两个各装一个球的盒子,Bob无法继续操作,因此Alice获胜。你的任务是找出谁会获胜。假定两人都很聪明,总是采取最优策略。
输入
输入最多包含300组测试数据。每组数据仅一行,包含一个整数n(2<=n<=10^9)。输入结束标志为n=0。
输出
对于每组数据,输出胜者的名字。
样例输入
2 3 4 0
样例输出
Alice Bob Alice
解题思路
不难发现如果n是偶数的话一定是Alice赢,那么只需要再去考虑奇数的情况。并且发现如果谁将一个奇数分为一个较大的偶数和一个较小的奇数那么他就输了。所以所有人都想把这个数分为一个较大的奇数和一个较小的偶数。当n=3 bob赢
n=5 alice赢
n=7 bob
n=9 alice
………………………………………………………………
如果谁拿到3 7 谁就输了,谁把3 7 分给别人谁就赢了
如果谁拿到5 9 谁就赢了。
当n=9 的时候可以分为 2 7 和4 5 ,alice当然要将2 7 分给bob 所以当n=9的时候alice赢
当n=11的时候可以分为 2 9 和4 7,alice当然要将4 7 分给bob 所以当n=11的时候alice赢
当n=13的时候可以分为2 11 、4 9、6 7,alice当然要将6 7 分给bob 所以当n=11的时候alice赢
………………………………………………………………
由上 发现alice想把7分给bob让自己赢 ,只有n<2*7+1时候才能分成较大奇数和较小偶数
并且谁拿到9 11 13 谁就赢了。
当n=15的时候可以分为 2 13 、4 11、6 9,alice怎么分都不能赢。
同理可证 如果n=2^k-1(k>0),bob一定赢, 其余情况都是alice赢。
代码
#include<cstdio> using namespace std; int main() { int n; while(scanf("%d",&n)&&n!=0) { if(n%2==0) printf("Alice\n"); else { n=n+1; while(n>2&&n%2!=1)//n是奇数说明不是2^n-1 就跳出 { n=n/2; } if(n%2==0)printf("Bob\n"); else printf("Alice\n"); } } return 0; }
相关文章推荐
- 异常机制及其处理
- 学习心得与写博计划
- (二)Get start with Arduino for windows【The Arduino Platform and C Pro】
- GNU Radio中的数据元(Metadata)
- 路由交换
- Oracle Memory Troubleshooting, Part 4: Drilling down into PGA memory usage with V$PROCESS_MEMORY_DET
- 【openjudge】股票买卖
- 大数的加减乘除
- 分类算法
- 每个程序员都应该了解的 CPU 高速缓存
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(三):素材最终解决方法
- vs调试中右键"设置下一语句"和"运行到光标处"的用法
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(三):素材最终解决方法
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(三):素材最终解决方法
- 信息安全系统设计基础实验四—20135215黄伟业20135222胡御风
- 英语四级-面对让我备受挫折、不断回避、留有心结的考验
- ASP.NET实现学生管理系统
- 1023. Have Fun with Numbers (20)
- Android解耦库EventBus的使用和源码分析