時間限制:1000ms 空間限制:512mb
description
小花梨有
?堆石子,第
?堆石子數量為??,
?堆石子順時針編號為
1 − ?
(如圖)。
遊戲將進行?
輪,每輪遊戲單獨進行,互不干擾,每輪初始時第?
堆石子數目為??
。第?
輪從編號為
?的那堆石子為起點,順時針來取石子。兩人輪流取石子,不可不取,最少取
乙個石子,最多把當前這一堆取完,只有取完一堆後才走到下一堆石子。走完一圈後石子都
被取完,不能取石子的人就失敗。假設兩人以最優策略進行取石子操作,請分別輸出
?輪遊
戲是先手勝還是後手勝。
input
第一行為正整數
?,表示石子的堆數
(1 ≤ ? ≤ 100000)
第二行輸入
?個正整數表示每一堆的石子數目
??(1 ≤ ?? ≤ 10
9 )
output輸出?
行,第?
行表示第
?輪遊戲的結果。如果先手勝則輸出
"?????"
,後手勝輸出
"??????"。
example
sample input sample output 3
2 1 3
first
second
first 2
2 2
first
first
note樣例1
: 遊戲進行3輪
第1輪遊戲石子堆下標的順序為
1 2 3
,此時石子數目按順序為
2 1 3
,先手勝 第
2輪遊戲石子堆下標的順序為
2 3 1
,此時石子數目按順序為
1 3 2
,後手勝 第
3輪遊戲石子堆下標的順序為
3 1 2
,此時石子數目按順序為
3 2 1
,先手勝
這道題不是尼姆博弈論(nimm game),因為在進行運算的時候順序是給定的。
舉個例子:現在有兩個資料,分別為3和4,如果想贏,那麼只要滿足先取就行了,因為對於3,一開始取2,那麼第二個人只能取1,這個時候第乙個人再把第二堆的4給取走,這樣就贏了,也就是說只要滿足所有的數字都是大於1的,就一定是先取者肯定勝利。
那現在資料變成三個的話,又會怎麼樣呢?
1:資料分別為:3 1 4 ,因為有乙個1存在,那麼如果說現在第乙個人在取的時候想贏,按照上面的方法,他取走3中的兩個陣列,現在資料變成 1 1 4,這樣第二個人只能取 1,現在資料變成 1 4,那麼緊接著第乙個人也是只能取1,現在資料變成4.......最後可以看出,肯定是第二個人贏。
那也就是說,在這種情況下,兩個人的勝負情況發生了改變。
不要被我誤導~~~這句話其實是不正確的,因為我們知道在進行博弈的過程中,我們每個人都是最聰明的那乙個,既然第乙個人在剛開始從3中拿兩個資料的時候就已經輸了,那為什麼不在這一部分進行乙個改變呢?直接把3給拿走完不就好了嗎,這樣到最後,勝利的還是1.
綜上所述,只要後面出現乙個比一大的數字,那麼不管它後面的數字情況如何,第乙個人都能勝利。
進行乙個引申:
2: 1 1 2
這種情況下,前面呢有兩個1,2%2=0,第乙個人先取能夠保證勝利。
剛才後面有一的時候,我們可以通過前面的數字進行調節,使得在當前情況下還能夠勝利,那麼現在我們只需計算從頭開始出現多少個1就能知道第乙個人先取還是後取才能保證勝利了。
#include#include#includeusing namespace std;
const int maxn=200005;
int a[maxn];
int number[maxn];
int main()}}
for(int i=0 ;i
return 0;
}
小花梨的取石子遊戲 博弈
小花梨有?堆石子,第?堆石子數量為?堆石子順時針編號為1 如圖 遊戲將進行?輪,每輪遊戲單獨進行,互不干擾,每輪初始時第?堆石子數目為?第?輪從編號為?的那堆石子為起點,順時針來取石子。兩人輪流取石子,不可不取,最少取 乙個石子,最多把當前這一堆取完,只有取完一堆後才走到下一堆石子。走完一圈後石子都...
問題 D 小花梨的取石子遊戲
本人是一名小弱雞,如果有錯誤,請各位大佬指出。第一次寫,希望大家能夠提出不足之處。小花梨有n堆石子,第i堆石子數量為ai,n堆石子順時針編號為1 n 如圖 遊戲將進行n輪,每輪遊戲單獨進行,互不干擾,每輪初始時第i堆石子數目為ai。第i輪從編號為i的那堆石子為起點,順時針來取石子。兩人輪流取石子,不...
ZOJ 問題 D 小花梨的取石子遊戲
題目描述 小花梨有n堆石子,第i堆石子數量為ai,n堆石子順時針編號為1 n 如圖 遊戲將進行n輪,每輪遊戲單獨進行,互不干擾,每輪初始時第i堆石子數目為ai。第i輪從編號為i的那堆石子為起點,順時針來取石子。兩人輪流取石子,不可不取,最少取乙個石子,最多把當前這一堆取完,只有取完一堆後才走到下一堆...