2014 9 13模擬賽 環上的遊戲

2021-06-25 15:50:29 字數 1125 閱讀 5710

環上的遊戲(cycle)

有乙個取數的遊戲。初始時,給出乙個環,環上的每條邊上都有乙個非負整數。這些整數中至少有乙個0。然後,將一枚硬幣放在環上的乙個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下:

(1)選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0;

(2)將這條邊上的數減至任意乙個非負整數(至少要有所減小);

(3)將硬幣移至邊的另一端。

如果輪到乙個玩家走,這時硬幣左右兩邊的邊上的數值都是0,那麼這個玩家就輸了。

如下圖,描述的是alice和bob兩人的對弈過程,其中黑色節點表示硬幣所在節點。結果圖(d)中,輪到bob走時,硬幣兩邊的邊上都是0,所以alcie獲勝。

現在,你的任務就是根據給出的環、邊上的數值以及起點(硬幣所在位置),判斷先走方是否有必勝的策略。

【輸入格式】

第一行乙個整數n(n≤20),表示環上的節點數。

第二行n個數,數值不超過30,依次表示n條邊上的數值。硬幣的起始位置在第一條邊與最後一條邊之間的節點上。

【輸出格式】

僅一行。若存在必勝策略,則輸出「yes」,否則輸出「no」。

【樣例】

cycle1.in 

2 5 3 0

cycle1.out

yescycle2.in

0 0 0

cycle2.out

no原題是wikioi(codevs?)1037

一題比較簡單的博弈論?好像連博弈論都不算

首先環中至少有1個0,所以就是一條鏈啦

然後注意到乙個結論:選定乙個方向沿著邊走下去,必須一次性把邊上的數取光。因為如果不取光,顯然對方可以倒著走把這條邊取光,這樣就回到原地,而且不能再往那個方向走。所以一次走必須把邊上的數取光。那麼只能一直不回頭的走下去了。如果有奇數條邊則先手必勝,如果有偶數條邊後手必勝。

這樣只要從起始位置往兩邊搜一下就好了

#includeint a[100];

int n;

int sa,sb;

int main()

省選模擬賽 環

分析 不算太難的一道題.如果把每個編號i看作乙個點,i向ai連邊,那麼最後一定會出現環,並且環與環之間是不相交的.那麼我們可以dfs預處理出所有的環,用詢問的m除以環的長度,剩下的餘數就可以o 1 計算了,時間複雜度o n 上面這種做法在處理餘數部分時比較容易寫錯.一種不容易寫錯的方法是倍增.複雜度...

模擬賽 nodgd的猜球遊戲

nodgd和p6pou在玩猜球遊戲,nodgd首先準備了10個小球,小球的編號從0 9。首先nodgd把這10個球按照從左到右編號為0,1,2,3.9的順序擺在了桌子上,接下來nodgd把這10個球用10個不透明的杯子倒扣住。nodgd接下來會按照一定的操作順序以極快的速度交換這些杯子。換完以後他問...

模擬賽 nodgd的猜球遊戲

nodgd和p6pou在玩猜球遊戲,nodgd首先準備了10個小球,小球的編號從0 9。首先nodgd把這10個球按照從左到右編號為0,1,2,3.9的順序擺在了桌子上,接下來nodgd把這10個球用10個不透明的杯子倒扣住。nodgd接下來會按照一定的操作順序以極快的速度交換這些杯子。換完以後他問...