洛谷P1288 取數遊戲II

2022-05-13 17:03:13 字數 1426 閱讀 6916

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

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

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

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

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

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

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

輸入格式:

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

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

輸出格式:

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

輸入樣例#1:

【輸入1】

42 5 3 0

【輸入2】

30 0 0

輸出樣例#1:

【輸出1】

yes【輸出2】

no

博弈論。

分析可知,走過一條邊的時候不取完邊上的數是沒有意義的。

假設每走一條邊都取完,如果從起點到0的位置有奇數條邊,則先手必勝,否則後手必勝。

正著掃一遍,反著掃一遍,如果從起點到第乙個遇到的0位置有奇數條邊,先手必勝。

1

/*by silvern

*/2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int mxn=100010;10

intread()

13while(ch>='

0' && ch<='9')

14return x*f;15}

16int

n,a[mxn];

17int

main()

26for(i=n;i;i--)if(!a[i])

30if(flag)printf("

no\n");

31else printf("

yes\n");

32return0;

33 }

洛谷 P1288 取數遊戲II

有乙個取數的遊戲。初始時,給出乙個環,環上的每條邊上都有乙個非負整數。這些整數中至少有乙個0。然後,將一枚硬幣放在環上的乙個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下 1 選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0 2 將這條邊上的數減至任意乙個非負整...

洛谷 P1288 取數遊戲II

題意 中文題面不贅述啦。題解 很好寫,其實就是判斷邊數是否為偶數。先手確定方向其實都是一樣的,但是起手肯定要先選完,不能給後手留棋子使他向反方向走。如果是偶數邊先手可以掌控局面。1 include 2 include 3 include 4 include 5 using namespace std...

洛谷 P1288 取數遊戲II 題解

題目 p1288 取數遊戲ii 博弈論 數論 我們可以把這個環想象成兩條路,如果路的盡頭沒有邊權為 0 00 的邊,那麼兩條路徑就是一樣的。對於一條路徑,設 ali ce alice alic e 為先手,那麼她將她走過的路徑邊權變為 0 00。輪到 bob bobbo b 時,他最多也只能有一條路...