除數博弈
阿新 • • 發佈:2020-07-24
除數博弈
愛麗絲和鮑勃一起玩遊戲,他們輪流行動,愛麗絲先手開局。
最初,黑板上有一個數字N
,在每個玩家的回合,玩家需要執行以下操作:
- 選出任一
x
,滿足0 < x < N
且N % x == 0
。 - 用
N - x
替換黑板上的數字N
。
如果玩家無法執行這些操作,就會輸掉遊戲。
只有在愛麗絲在遊戲中取得勝利時才返回true
,否則返回false
,假設兩個玩家都以最佳狀態參與遊戲。
示例
輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。
輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。
題解
/** * @param {number} N * @return {boolean} */ var divisorGame = function(n) { return n & 1 ? false : true; };
思路
理解一下題意,查看了輸入輸出示例,推斷這是一個通過判斷奇偶性決定勝負的遊戲。
這裡引用官方推論:博弈類的問題常常讓我們摸不著頭腦。當我們沒有解題思路的時候,不妨試著寫幾項試試:
N = 1
的時候,區間(0, 1)
中沒有整數是 n的因數,所以此時Alice
敗。N = 2
的時候,Alice
只能拿1
,N
變成1
,Bob
無法繼續操作,故Alice
勝。N = 3
的時候,Alice
只能拿1
,N
變成2
,根據N = 2
的結論,我們知道此時Bob
會獲勝,Alice
敗。N = 4
的時候,Alice
能拿1
或2
,如果Alice
拿1
,根據N = 3
的結論,Bob
會失敗,Alice
會獲勝。N = 5
的時候,Alice
11
,根據N = 4
的結論,Alice
會失敗。......
寫到這裡,也許你有了一些猜想。沒關係,請大膽地猜想,在這種情況下大膽地猜想是AC
的第一步。也許你會發現這樣一個現象:N
為奇數的時候Alice
(先手)必敗,N
為偶數的時候 Alice
必勝。 這個猜想是否正確呢?下面我們來想辦法證明它。
證明:N = 1
和N = 2
時結論成立。
N > 2
時,假設N ≤ k
時該結論成立,則N = k + 1
時,如果k
為偶數,則k + 1
為奇數,x
是k + 1
的因數,只可能是奇數,而奇數減去奇數等於偶數,且k+1−x≤k
,故輪到Bob
的時候都是偶數。而根據我們的猜想假設N≤k
的時候偶數的時候先手必勝,故此時無論Alice
Bob
都會處於必勝態,所以Alice
處於必敗態。如果kk
為奇數,則k + 1
為偶數,x
可以是奇數也可以是偶數,若Alice
減去一個奇數,那麼k+1−x
是一個小於等於k
的奇數,此時Bob
佔有它,處於必敗態,則Alice
處於必勝態。綜上所述,這個猜想是正確的。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://leetcode-cn.com/problems/divisor-game