原題:兩個玩家,一堆石頭,假設多於100塊,兩人依次拿,最後拿光者贏,規則是:分析:第乙個人不能一次拿光所有的;
第一次拿了之後, 每人每次最多只能拿對方前一次拿的數目的兩倍。求先拿者必勝策略, 如果有的話。怎麼證明必勝。
這是斐波那契博弈,當且僅當石頭個數是斐波那契數的時候先手必敗。
讓我們用第二數學歸納法證明:
為了方便,我們將n
記為f[i]
。
1、當i=2
時,因為不能全部去完,先手只能取1顆,顯然必敗,結論成立。
2、假設當i<=k
時,結論成立。
則當i=k+1
時,f[i] = f[k]+f[k-1]
。
則我們可以把這一堆石子看成兩堆,簡稱k
堆和k-1
堆。
(一定可以看成兩堆,因為假如先手第一次取的石子數大於或等於f[k-1]
,則後手可以直接取完f[k]
,因為f[k] < 2*f[k-1]
)
對於k-1
堆,由假設可知,不論先手怎樣取,後手總能取到最後一顆。下面我們分析一下後手最後取的石子數x
的情況。
如果先手第一次取的石子數y>=f[k-1]/3
,則這小堆所剩的石子數小於2y
,即後手可以直接取完,此時x=f[k-1]-y
,則x<=2/3*f[k-1]
。
我們來比較一下2/3*f[k-1]
與1/2*f[k]
的大小。即4*f[k-1]
與3*f[k]
的大小,對兩值作差後不難得出,後者大。
所以我們得到,x<1/2*f[k]
。
即後手取完k-1
堆後,先手不能一下取完k
堆,所以遊戲規則沒有改變,則由假設可知,對於k
堆,後手仍能取到最後一顆,所以後手必勝。
即i=k+1
時,結論依然成立。
那麼,當n
不是fibonacci數的時候,情況又是怎樣的呢?
這裡需要借助「zeckendorf定理」(齊肯多夫定理):任何正整數可以表示為若干個不連續的fibonacci數之和。
關於這個定理的證明,感興趣的同學可以在網上搜尋相關資料,這裡不再詳述。
分解的時候,要取盡量大的fibonacci數。
比如分解85:85在55和89之間,於是可以寫成85=55+30,然後繼續分解30,30在21和34之間,所以可以寫成30=21+9,
依此類推,最後分解成85=55+21+8+1。
則我們可以把n
寫成n = f[a1]+f[a2]+……+f[ap]
。(a1>a2>……>ap
)
我們令先手先取完f[ap]
,即最小的這一堆。由於各個f
之間不連續,則a(p-1) > ap + 1
,則有f[a(p-1)] > 2*f[ap]
。即後手只能取f[a(p-1)]
這一堆,且不能一次取完。
此時後手相當於面臨這個子遊戲(只有f[a(p-1)]
這一堆石子,且後手先取)的必敗態,即先手一定可以取到這一堆的最後一顆石子。
同理可知,對於以後的每一堆,先手都可以取到這一堆的最後一顆石子,從而獲得遊戲的勝利。
待字閨中 面試題 海枯石爛
題目 兩個玩家,一堆石頭,假設多餘100塊,兩人一次拿,最後拿光者贏。規則是 1.第乙個人不能第一次就拿光所有石頭 2.第一次拿了之後,每個人最多只能拿對方前一次拿的數目的兩倍,最少拿乙個。求 先拿著必勝的策略,若果有的話,怎麼證明其正確性。思路和解決辦法 1 兩人輪流拿,先拿者每次拿乙個,那麼他就...
待字閨中之雞蛋挺住體
題目 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋 方法分析 看到這個題目,最保險的方法就是一層一層試驗,但這樣只需要乙個雞蛋就可以了。我們現在有兩個雞蛋...
待字閨中之巧妙排序分析
排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。分析 這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o nlogn 顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看...