2023年8月18日,阿里巴巴程式設計公開賽a題。
本題類似我曾今玩過的的乙個nds解密遊戲《雷頓教授與魔神之笛》裡的一道謎題。遊戲裡是給你15個圍成圈的水龍頭,開始它們全都是開啟漏水的。接著你要跟電腦博弈,從電腦開始,雙方可以選擇關閉連續的兩個水龍頭(當然,已關的不能再開啟了)也可以只選擇關掉乙個,最終沒水龍頭可關的將失敗。在沒學相關知識之前那迷題一直讓我挺頭疼的。。。
那個遊戲的答案解法是,由於電腦一定會先關掉兩個水龍頭,接著你只要關掉剩餘水龍頭的中間那個,因而將剩餘的水龍頭分成數目相等的兩個部分。那後無論電腦操作哪一部分的一或二個水龍頭,你只要一樣對稱地關掉另一部分得水龍頭。那你一定會是勝利者!
本題相當於是該迷題的乙個拓展。
我們首先要分幾種情況考慮:
1.當 k=1時,若n為奇數,則first wins,n為偶數則second wins。
2.當 k>=n時,first wins。
3.當 n>k>1時,情況類似上面提到過的謎題,若first的最先操作使得剩下的水龍頭為偶數,如果你能把剩下的取完那就直接勝利,如果不能那就拿走中間的若干個偶數個硬幣使得剩下的硬幣被分為數目相等的兩堆。接著對方對某堆進行操作你就對另一堆進行同樣的操作,這時是second wins。first的最先操作使得剩下的水龍頭為奇數時同理可證second wins。
那就ok了。
code:
#includeusing namespace std;
int t,n,k,case=1;
int main()
{ cin>>t;
while(t--)
{cin>>n>>k;
if(k==1)
if(n%2==0)
{cout<<"case "<=n)
{cout<<"case "<
這個問題是取子中比較簡單的一種。
除此之外還有很多取子問題,比如nim取子以及它的許多變種等。
395 硬幣排成線 II
中文english 有n個不同價值的硬幣排成一條線。兩個參賽者輪流從 左邊 依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。計算兩個人分別拿到的硬幣總價值,價值高的人獲勝。請判定 先手玩家 必勝還是必敗?若必勝,返回true,否則返回false.樣例 1 輸入 1,2,2 輸出 true 解釋 先手...
leetcode 395 雙指標X 分治
這題一看太像雙指標了,熟悉的子區間問題,但這次不太一樣。熟悉的雙指標模板這裡是不適用的。所以本題應該用分治做。關鍵的點在於,如果在字串裡有乙個字元,他總數小於k,那麼,任何包含這個字元的子串都不滿足條件。所以,咱們應該把這個字元剔除出去,這個是核心。如下 class solution def lon...
AcWing 395 分離的路徑
要求兩個點之間至少要有兩條不相交的道路可以到達 那就是說兩個點在乙個環內 對於已經在環內的點就不用管了,所以先縮點 再對於縮完點之後的樹,入度為1 11的點之間是需要有一條邊的 所以每兩個葉子節點之間連一條邊,多出來的最後乙個點只能和別的環內的點連邊 所以最後的答案就是 le af 1 2 leaf...