2011年湖南省第七屆大學生計算機程序設計競賽,E題,盒子游戲(題目鏈接)。
盒子游戲
Description
有兩個相同的盒子,其中一個裝了n個球,另一個裝了一個球。Alice和Bob發明了一個游戲,規則如下: Alice和Bob輪流操作,Alice先操作。每次操作時,游戲者先看看哪個盒子里的球的數目比較少,然后清空這個盒子(盒子里的球直接扔掉),然后把另一個盒子里的球拿一些到這個盒子中,使得兩個盒子都至少有一個球。如果一個游戲者無法進行操作,他(她)就輸了。下圖是一個典型的游戲:

面對兩個各裝一個球的盒子,Bob無法繼續操作,因此Alice獲勝。你的任務是找出誰會獲勝。假定兩人都很聰明,總是采取最優策略。
Input
輸入最多包含300組測試數據。每組數據僅一行,包含一個整數n(2 ≤ n ≤ 109)。輸入結束標志為 n = 0。
Output
對於每組數據,輸出勝者的名字。
Sample Input
2
3
4
0
Sample Output
Alice
Bob
Alice
題目的“游戲者先看看哪個盒子里的球的數目比較少,然后清空這個盒子(盒子里的球直接扔掉),然后把另一個盒子里的球拿一些到這個盒子中”講得不是很明確,導致我做錯了很多次。“兩個盒子里球的數目相等的時候任意清空一個盒子”這句話沒講。結果我誤以為只要兩個盒子里球的數目相等,就無法選擇一個盒子來清空,因此就輸了。實際上題目的意思是:當“清空一個盒子,無法再從另一個盒子中分一部分球過來,使得兩個盒子都至少一個”的時候,才算輸。這一題非常簡單——既然每次都是倒掉球的數目較少的一邊,那么實際上相當於只有球的數目較多的那一個盒子,只剩下一個的時候,就輸了。所以,根據推算,只要輸入的數字是2n-1就一定是Bob贏,否則就是Alice贏。
C語言源代碼如下:
#include <stdio.h> #include <stdlib.h> int main (void) { int n; while ( scanf( "%d", &n ) , n ) { n ++; while ( (n&1) == 0 ) n >>= 1; if ( n == 1 ) puts( "Bob" ); else puts( "Alice" ); } return EXIT_SUCCESS; }