2014攜程第二場1004 奪旗 Nim變形

2021-06-21 12:58:18 字數 1431 閱讀 1518

小時候玩過一種小遊戲,奪旗。遊戲規則:共有n組旗子,每組旗子數量已知,兩個玩家輪流拔旗,每次只能選

某 一組,拔掉一定數量的旗子,至少需要拔乙個,拔掉旗子之後,還可以將該組旗子中餘下的任意多個旗子中

任選幾個放到其它的任意一組或幾組裡。一堆旗子被拔空後就不能再往此處插旗了。先無法拔旗的人為輸者。

假設每次都是你先拔旗子,且每個player都足夠聰明,現在給你旗子的組數、每組旗子的數量,請判斷出你能

否獲勝。

例如:如果最開始有4組旗子,旗子個數分別為3 1 4 2,而你想決定要先拿走第三組旗子中的兩個旗子,旗子

個數變為3 1 2 2,然後他可以使旗子組達到的狀態有以下幾種:

3 1 2 2(不移動)

4 1 1 2(移動到第一組乙個)

3 2 1 2(移動到第二組乙個)

3 1 1 3(移動到第四組乙個)

4 2 0 2(移動到第一組乙個,第二組乙個)

4 1 0 3(移動到第一組乙個,第四組乙個)

3 2 0 3(移動到第二組乙個,第四組乙個)

5 1 0 2(全部移動到第一組)

3 3 0 2(全部移動到第二組)

3 1 0 4(全部移動到最後)

可能有多組測試資料(測試資料組數不超過1000)

每組測試資料的第一行是乙個整數,表示n(1<=n<=10)

第二行是n個整數分別表示該組旗子中旗子的數量。(每組旗子數目不超過100)

當輸入的n為0時,表示輸入結束輸出對於每組測試資料。

win表示你可以獲勝,輸出lose表示你必然會敗。

3

2 1 3

21 1

0

win

lose

codingtrip - 攜程程式設計大賽 (預賽第二場)

本質:nim遊戲變形

思路:

n=1的情況不用考慮,考慮n=2的情況,注意到當兩堆石子的數量一樣的時候,無論先手做何操作,只要後手模仿先手的操作即可回到兩堆石子數量一樣的狀態,模擬n=2的情況,在n=4的時候只要有兩對石子的個數是一樣的也必敗,後手同樣只要模仿先手的操作即可,以此類推。

那麼當石子數不是兩兩配對的時候呢?那麼只要將石子個數排序,然後把最多的一堆石子變成和最少的一堆石子一樣多,再將多餘出來的石子分配給中間的堆,使其兩兩配對即可,至於為什麼一定可以將其兩兩配對,只要將中間石子兩兩的差投影到y軸即可證明。

那麼n為偶數的情況就解決了,至於n為奇數的情況,只要將最多的那堆取完,再把多餘的石子分配給剩下的使其兩兩配對即可,證明同上。

#include#includeint cmp(const void *a,const void *b)

int k[15];

int main()

return 0;

}

攜程程式設計大賽 (預賽第二場)

a 和食物鏈做法一樣,帶權並查集 b dp,01揹包背出所有能組成邊情況,在用這些情況去計算面積保留最大值 c 每個點從後往前搜,搜到合適就輸出,搜不到就輸出255 255 255 d 博弈,如果成對成對出現後手勝,否則先手勝 a include include const int n 10005 ...

2014程式設計之美初賽第二場

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 大神同學是乙個熱愛數字的孩子,她無時無刻不在思考生活與數學的聯絡。有一天,她發現其實公曆的設計是有講究的。每4年就會多閏一天,每一百年又會有一年不是閏年,而第四百年又是閏年。這樣,這四百年的週期裡每一年平均有365又400分之9...

2014程式設計之美初賽第二場

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 大神同學是乙個熱愛數字的孩子。她無時無刻不在思考生活與數學的聯絡。有一天,她發現事實上公曆的設計是有講究的。每4年就會多閏一天,每一百年又會有一年不是閏年。而第四百年又是閏年。這樣。這四百年的週期裡每一年平均有365又400分之...