【題目描述】
愛麗絲和鮑勃一起玩游戲,他們輪流行動(dòng)。愛麗絲先手開局。
最初,黑板上有一個(gè)數(shù)字 N 。在每個(gè)玩家的回合,玩家需要執(zhí)行以下操作:
- 選出任一 x,滿足 0 < x < N 且 N % x == 0 。
- 用 N - x 替換黑板上的數(shù)字 N 。
如果玩家無(wú)法執(zhí)行這些操作,就會(huì)輸?shù)粲螒颉?/li>
只有在愛麗絲在游戲中取得勝利時(shí)才返回 True,否則返回 false。假設(shè)兩個(gè)玩家都以最佳狀態(tài)參與游戲。
【示例1】
輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無(wú)法進(jìn)行操作。
【示例2】
輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然后愛麗絲無(wú)法進(jìn)行操作。
【提示】
1 <= N <= 1000
【解1】數(shù)學(xué)歸納法
1、仔細(xì)讀幾遍題意,其實(shí)這是一道數(shù)學(xué)題,歸納法可以解出
2、題目要求 選出的x 必須滿足 0 < x < N 且 N % x == 0,然后 N = N - x
3、如果雙方玩家選出的數(shù)字x 不能滿足0 < x < N 且 N % x == 0,就輸?shù)舯荣?/p>
思路:偶數(shù)先手贏
1、愛麗絲先手,只要每次愛麗絲操作的時(shí)候 N為偶數(shù),那么她就穩(wěn)贏,因?yàn)榕紨?shù)的話,愛麗絲可以一直選擇1,留給鮑勃的數(shù)字一直是奇數(shù),鮑勃只能選擇1,那么最后數(shù)字N都會(huì)走到為2時(shí),愛麗絲選擇1就會(huì)贏。
2、所以就是判斷給出的數(shù)是奇數(shù)還是偶數(shù)
代碼就一行:
func divisorGame(_ N: Int) -> Bool {
return N%2 == 0
}
【解2】
動(dòng)態(tài)規(guī)劃