/*
拈石遊戲分析:
有n塊石頭和兩個玩家a和b,玩家a先將石頭分成若干堆,然後按照baba...的順序不斷輪流取石頭,能將剩下的石頭
一次取光的玩家獲勝。每次取石頭的時候,每個玩家只能從若干堆石頭中任選一堆,取這一堆石頭中任意數目
(大於0)個石頭。
問:玩家a要怎樣分配和取石頭才能保證自己有把握取勝?
經分析得出:
若石頭數目是偶數,則分成兩堆,形成(x,x)局面,此時無論對手從一堆中拿幾個,你從另一堆中拿幾個就可以
若石頭數目是奇數,擺成奇數個1,你必輸,參見(1,1,1),若有偶數個,先取者必輸,參見(1,1)
當擺放方法為(1,1,1...,1,x)時,先拿者必贏
若有奇數個1,先拿者可以拿走x-1,形成偶數個1情形
若有偶數個1,先拿者拿走x
關鍵是:找到一系列變化過程中有沒有乙個特性始終決定著輸贏。
異或規則:xor(0,0) = 0,xor(1,0) = 1,xor(1,1) = 0
整個遊戲過程:
從(m1,m2,..,mn)到(0,0,...,0)
當m為偶數的時候,取勝策略是把m分成相同兩份
開始:(m1,m1) ,異或結果為0
中途:(m1,m2),xor(m1,m2)!= 0
我方:(m2,m2),始終讓其相等,異或為-
最後(0,0)取勝
若m為奇數,石頭分成奇數個1,異或結果為1,先拿者會使其變成偶數個1,異或為0結束
因為奇數的最低為1,最終異或的結果的最低為1
總結:當石頭個數為奇數時,先拿者贏。
寫乙個程式:返回當輸入為(m1,m2,...,mn)的時候,到底如何取石頭,才有贏的可能,
輸入:3 4 5
輸出:1 4 5
*/
程式設計之美 第一章 1 16 24點遊戲
24點遊戲 給玩家4張牌,每張牌的面值在1 13之間,允許其中有數值相同的牌。採用加減乘除,允許中間運算存在小數,並且可以使用括號,但每張牌只能使用一次,嘗試 構造表示式,使其運算結果為24.輸入 n1,n2,n3,n4 輸出 若能得到運算結果為24,輸出對應表示式 輸入 11,8,3,5 輸出 1...
程式設計之美 第一章 1 4 買書問題
買書問題 過程 接受輸入,對輸入按照從大到小排序 a,b,c,d,e 然後選取min,設定遞迴出口是全0 輸入 2 1 1 1 1 2 2 2 1 1 2 2 2 2 2 10 10 10 10 10 輸出 38.0 51.2 60.0 300.0 include include include i...
程式設計之美 第一章 1 5快速找出機器故障
快速找出機器故障 為了保證搜尋引擎的服務質量,我們需要保證每份資料都有多個備份 假設乙個機器僅儲存了乙個標號為id的記錄 假設id是小於10億的整數 假設每份資料儲存了兩個備份,這樣 就有兩個機器儲存了同樣的資料。1在某個時間,如果得到乙個資料檔案id的列表,是否能夠快速地找出這個表中僅出現一次的i...