您的位置:首页 > 其它

盒子游戏

2015-11-29 15:14 253 查看


题目描述

有两个相同的盒子,其中一个装了n个球,另一个装了一个球。Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后清空这个盒子(盒子里的球直接扔掉),然后把另一个盒子里的球拿一些到这个盒子中,使得两个盒子都至少有一个球。如果一个游戏者无法进行操作,他(她)就输了。下图是一个典型的游戏:



面对两个各装一个球的盒子,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: