IOI2018 組合動作 題解

2021-09-10 16:37:37 字數 1330 閱讀 8540

傳送門 loj2863

果然簽到題就是好玩

首先我們可以猜2次來猜出第乙個字元是什麼,後面的串就和這個字元沒關係了。

假設剩下的三個字元是tmp[0]tmp[1]tmp[2],目前已知答案串的長度為i−1

i-1i−

1的字首是ans。考慮第i

ii位(i≤n

−1

i\leq n-1

i≤n−

1),我們可以在ans串後面接上乙個字元然後press來檢查有沒有獲得更多的金幣,但是這樣的話你總共要press大約3n3n

3n次,不夠理想。

我們可以設計一種方法來一次就獲得s[i]是什麼字元,那就需要設計乙個串p使得對於不同的s[i]press(p)的返回值不同。我們可以令p=ans+tmp[0]+ans+tmp[1]+tmp[0]+ans+tmp[1]+tmp[1]+ans+tmp[1]+tmp[2],那麼如果press(p)返回的是i−1

i-1i−

1就說明第i

ii位是tmp[2],如果返回值是i

ii就說明第i

ii位是tmp[0],否則就是tmp[1]

對於最後一位,再press兩下就行了。

#include

"combo.h"

#include

char tmp[3]

;std::string guess_sequence

(int n)

else

std::string ans; ans +

= first;

if(n ==1)

return ans;

for(

int i =

2; i < n;

++i)if(

press

(ans + tmp[0]

)== n) ans +

= tmp[0]

;elseif(

press

(ans + tmp[1]

)== n) ans +

= tmp[1]

;else ans +

= tmp[2]

;return ans;

}

IOI2018 組合動作

題目 我是垃圾 最開始覺得可以三次問出第一位,之後還有 n 1 位和 n 1 次詢問,只需要一次確定一位就好了 之後就發現我是垃圾,上來直接press ab 如果不是 0 那麼首位就是 a 或 b 否則就是 x 或 y 之後再問一次就好了 之後我們需要用 n 次確定 n 1 位,於是就開始大躍進了 ...

LeetCode 39 組合總和 題解

給定乙個包含無重複元素的陣列candidates和乙個目標數target,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。vectorint res void dfs int depth,int target,vector ...

LeetCode題解(python) 77 組合

leetcode題解 python 77.組合 給定兩個整數 n 和 k,返回 1 n 中所有可能的 k 個數的組合。示例 輸入 n 4,k 2 輸出 2,4 3,4 2,3 1,2 1,3 1,4 解題心得本題是組合問題,顯然要用遞迴回溯的方法。首先找到規律,要從n個元素中取k個元素,可以視為 1...