CodeForces 1382B 題解 思維 博弈

2021-10-08 10:25:53 字數 1395 閱讀 5909

有n

nn堆石子,每堆a

ia_i

ai​個

兩人按順序從第1∼n

1 \sim n

1∼n堆取出1∼a

i1 \sim a_i

1∼ai

​個石子

最先取完的人獲勝,若每個人都採取最優方案,求贏家

time: 1000 ms

memory: 262144 kb

博弈論

結論:當a序列都為1時,若n為奇數,先手必贏,否則後手必贏

當a序列不都為1時,偶數個字首1後手必贏,奇數個字首1先手必贏 1

11是最特殊的元素,如果當前堆只有1

11個石子,那麼玩家別無選擇,下乙個玩家從新的一堆開始,如果下一堆石子個數在1

11個以上,那麼玩家可以選擇拿走ai−

1a_i - 1

ai​−

1個,剩餘1個繼續讓剛剛的玩家處於劣勢

如果沒有1

11,那麼先手是必贏的,因為只要重複上述過程,直到最後一堆自己取完就可以贏了

如果只有字首1

11,且為偶數堆,經過偶數輪操作,當1

11被取完後,此時玩家1仍處於先手,剩餘部分沒有1

11,回到了第一種狀態,先手贏;如果字首1

11為偶數堆,取完字首1後玩家2處於先手,即後手贏;

考慮字尾1

11. 實際上字尾1的奇偶並不影響結果,看一組例子

由此可知,字尾1

11不會影響結果故可以忽略字尾的1

114. 考慮中間的1

11. 實際上中間的1

11同樣不會影響結果,由第3種情況可以知道,第乙個拿到非1

11石子的人可以控制自己後面拿到哪一堆,同樣,他可以控制自己是否拿到中間最後一堆是1

11的石子,也就可以決定自己的輸贏

如果不能理解自己可以舉幾組石子試試,注意拿石子之後盡量歸到上面幾種子問題的情況

綜上述推理,不難得到上面的結論

#include

using

namespace std;

intmain()

int cnt =0;

for(

int i =

0; i < n; i++

)else}if

(cnt == n) cnt++

;// 由於是否都為1的情況和字首1的情況相反,故這裡給cnt++,統一輸出格式

printf

(cnt &1?

"second\n"

:"first\n");

}return0;

}

CODEFORCES 535B 解題報告

仍然是水題,但是還是有可以說的地方。主要思路就是dfs可重排列。4,7組成的幸運數字,在n位數字的構造方式有2 n種,而資料是最多9位,則列舉只有512種,n 2的複雜度足矣。只列舉相應位數的4 7排列,前面的個數用2 n累加。只要遵循先選4再選7即可構造字典順序,然後查詢相應數。以下是 可直接ac...

CodeForces 816B(區間計數)

codeforces 816b 題意 給出n個區間和乙個k值,再給出q次詢問,每次詢問給出乙個區間,要求這個區間中的數在開始的n區間中出現次數不少於k次的數目。解法 將n個區間的每個數每出現一次就加一,最後統計q詢問的區間中不小於k的數的個數。寫這題主要是想講乙個常用的區間更新的方法,其實這題也可以...

Codeforces 965B 題解報告

當k 1時,取第乙個 的座標即可 當k 1時,需要求出每乙個點在上下左右四個方向所能到達的最遠處,記為up,down,left,right,再取上下方向和左右方向的和的最大值,即 max 0,up down k max 0,left right k n,k map int,input split a...