NOIP題目解析之取石子問題
題目:
現有5堆石子,石子數依次為3,5,7,19,50.甲乙兩人輪流從任一堆中取石子,取最後一顆石子的一方獲勝,甲先取,請問甲有沒有獲勝策略?如果有,甲第一步應在哪一堆裡取多少?
解析:
在解這一道題之前,我們可以先來把問題簡化。把五堆石子轉化成兩堆,石子數分別為 3 和 5 。探查其規律,我們發現,要使甲獲勝,必須使得存在一種可能,就是當甲取了石子之後,到乙開始取石子時,兩堆石子的數目要保持一致。這樣,不管乙取多少,只要甲在另一堆取走相同的數量的石子,則甲最後必定是最後一個取走最後一顆石子的。(可以在紙上進行一下推算)
那麼,在這個簡化的題目上,我們發現很重要兩個判定:
1)要想甲取勝,則當其取石子時,兩堆石子必定是保持不平衡的狀態,此時甲取走多餘的部分,使得兩堆石子保持平衡
2)當乙在兩堆數目相同的石子上任意選一堆取一定的棋子時,都必定會使得當前兩堆棋子形成一種不平衡的狀態(兩端資料不對稱即為不平衡)
而我們發現,要使得甲獲勝,則必須保證在其取石子前,石子的資料應該是保持不平衡的狀態,我們姑且用非負態來表示這種不平衡的狀態。反之,我們則用負態來表示平衡的狀態。那麼前面根據兩個判定,我們可以得出另外一個結論:
要使得非負態轉化成負態,只有一種操作,就是保持平衡。而當我們處於負態時,可以通過操作一定的石子改變這種狀態
也就是說,其實我們可以撿走石子的過程,就是不斷在改變這兩種狀態的過程。而只要甲能夠保持在這個狀態轉換的過程中,一直處於將非負態轉化成負態的過程即可獲勝。
那麼,我們明白了甲要獲勝的一個原理,就要繼續回到我們的實踐操作之——應該取走多少石子。
因為我們發現,整一個過程就是兩種狀態的切換,也就是可以和不可以
基礎:二進位制
二進位制數字,指的是逢二進一,意思是當我們從0開始數數時,當數到2時,需要向前進一位,而當前位為0。也就是說,二進位制數字只有0 和 1這兩個數字。它和十進位制的區別就在於什麼時候進位。我們來看一組二進位制和10進位制的對比:
二進位制 10進位制 0 0 1 1 10 2 11 3 100 4 101 5 110 6 111 7 1000 8 1001 9 1010 10
我們發現,同樣是數字,在二進位制裡面就沒有出現過2以上的數字,這也是因為我們逢二進一的結果。
那我們說到要用二進位制,可是題目的資料又是十進位制的,那我們怎麼實現二進位制和10進位制的轉換呢?我們來看一下:
二進位制和十進位制的相互轉換
1.十進位制轉化成二進位制:
當我們要將10進位制轉化為2進位制時,有一個比較簡單的方法,我們可以通過篩查的方式實現,什麼意思呢?跟著思路走:
1.在紙上畫出一個篩選的“柱子”,從右到左分別是2的0次方—–2的n-1次方。比如:
256 128 64 32 16 8 4 2 1
然後,把我們要轉換的10進位制數取出來(以數字9為例),我們判斷這個數字在哪個區間段之間(9在 8->16之間),取最小值(8)。,在8的上面寫1。也就是
1
256 128 64 32 16 8 4 2 1
接著,用9減去8,剩餘的數字是1,重複上述的操作,直到10進位制數最終減為0(在這裡,1對應1,在1上面寫下1,此時1-1已經等於0),而柱子表示為:
1 1
256 128 64 32 16 8 4 2 1
最後:把所有沒有1的部分寫上0,即
0 0 0 0 0 1 0 0 1
256 128 64 32 16 8 4 2 1
最左邊一個1往左的所有0可以刪去,即最後的結果為:1001
2.二進位制轉10進位制
我們上面介紹了10進位制轉2進位制的方式,那二進位制轉10進位制呢,其實也是通過我們的“柱子”。怎麼來呢?
第一步,把柱子寫出來:
256 128 64 32 16 8 4 2 1
第二步:把二進位制數字的最右邊和柱子的最右邊契合,以10010為例:
1 0 0 1 0
256 128 64 32 16 8 4 2 1
第三步:把二進位制中1所在的柱子的數字拿出來,相加,就是
16+2=18
18就是我們想要的結果~
好啦,說完了二進位制,我們繼續迴歸剛才的問題,我們同樣以3 和 5 為例,我們要判斷當前棋子的分散式哪一種狀態,是不是就是看這兩堆石子是不是處於平衡的狀態。比如:
3的二進位制是: 011
則其對應狀態應該也是 011
而5的二進位制是: 101
則我們可以很清晰地看到,應該對應的狀態
除於非負態,甲有獲勝策略。那要取多少石子呢?
是不是就是 101 - 011=5-3=2.
上面的是以兩堆石子為例的情況分析。那當我們面臨多堆石子的情況時,應該怎麼確定應該對應的狀態呢?其實我們可以發現,只要我們保證在二進位制情況下,每一次甲取完之後,只要各個數位的1的總和為偶數,則不論乙怎麼取其中的哪一堆上的數字,甲都能通過取走其他堆的石子,使其繼續保持偶數的狀態。比如:
0 1 1
0 1 1
0 2 2
我們發現往上往下看,每個
數位上的1都是偶數個(0也算偶數)
那麼,對於 3 5 7 19 50這5堆石子來說,因為50的數目是最大的,也就是我們有且僅有取這一堆石子的時候,才能保證把剩餘的不平衡的狀態去掉,變成一個平衡的狀態,也就是非負態。所以,我們題目可以理解為:
當目前有3 5 7 19這四堆石子時,新增多少石子可以使其變成負態。即:
數字 對應的二進位制數
3 00011
5 00101
7 00111
19 10011
個數位的1的個數: 10234
那我們的對應狀態
就應該是(奇數為1,偶數為0): 10010
也就是說,要使得當前狀態為負態,則第五堆的石子數量應該是(10010),轉化成10進位制數,就是18。
也就是說,當甲第一次在50個石子裡面取(50-18=32)個石子時,能夠使得當前的狀態為負態。也就是必勝的策略。解題完畢~~~