小時候玩過一種小遊戲,奪旗。遊戲規則:共有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表示你必然會敗。
32 1 3
21 1
0
winlose
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分之...