盒子游戲
Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d
& %I64u
Description
有兩個相同的盒子,其中一個裝了n個球,另一個裝了一個球。Alice和Bob發明了一個遊戲,規則如下:Alice和Bob輪流操作,Alice先操作每次操作時,遊戲者先看看哪個盒子裏的球的數目比較少,然後清空這個盒子(盒子裏的球直接扔掉),然後把另一個盒子裏的球拿一些到這個盒子中,使得兩個盒子都至少有一個球。如果一個遊戲者無法進行操作,他(她)就輸了。下圖是一個典型的遊戲:
面對兩個各裝一個球的盒子,Bob無法繼續操作,因此Alice獲勝。你的任務是找出誰會獲勝。假定兩人都很聰明,總是採取最優策略。
面對兩個各裝一個球的盒子,Bob無法繼續操作,因此Alice獲勝。你的任務是找出誰會獲勝。假定兩人都很聰明,總是採取最優策略。
Input
輸入最多包含300組測試數據。每組數據僅一行,包含一個整數n(2<=n<=10^9)。輸入結束標誌爲n=0。
Output
對於每組數據,輸出勝者的名字。
Sample Input
2 3 4 0
Sample Output
Alice Bob Alice
博弈論,核心思路就是本人操作後,留下的大數不能是偶數。
如果大數是偶數,則可以平分,後面的人則無法操作了(要捨棄小得數,現在兩數相同,則無法捨棄),即贏了。
也就是說當前大的數爲奇數,則肯定可以分爲一個奇數,一個偶數,如果分出來的數是偶數大,則接下來的人捨棄奇數,然後把偶數平分後則就贏了。
AC代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int fun(int n)
{
if(n==1)
{
return 0;
}
if(n%2!=0)
{
return fun(n/2);
}
return n/2;
}
int main()
{
int n;
while(true)
{
scanf("%d",&n);
if(n==0)
{
break;
}
if(fun(n))
{
printf("Alice\n");
}
else
{
printf("Bob\n");
}
}
return 0;
}