題目
我是垃圾;
最開始覺得可以三次問出第一位,之後還有\(n-1\)位和\(n-1\)次詢問,只需要一次確定一位就好了;之後就發現我是垃圾,上來直接press("ab")
,如果不是\(0\)那麼首位就是\(a\)或\(b\),否則就是\(x\)或\(y\),之後再問一次就好了;
之後我們需要用\(n\)次確定\(n-1\)位,於是就開始大躍進了;想著這個應該是除了最後一位需要特殊搞搞,其他只需要一次詢問就好了吧;但為什麼最後一位需要特殊搞呢,他肯定是讓我一次確定兩位!
設目前已經確定的字首是\(s\),不妨假設首位就是\(x\),如果我們詢問的串是\(s+a+a,s+a+b,s+a+y,s+b+a\)四個串拼起來,那麼觀察一波發現如果返回的增量是\(0\),說明\(a,b\)都不行,這一位是\(y\);如果返回的增量是\(1\),那麼不可能是\(y\),也不可能是\(a\),畢竟\(a\)後面的三種情況我們都問了,於是這一位是\(b\);如果增量是\(2\)呢,下兩位可能是\(aa,ab,ay,ba\)
之後就自閉了,於是就想再問一次把兩位都確定下來,就想著我們可以再問一下\(s+a+y,s+a+a\),如果增量是\(0\),那麼就是\(ba\)了;如果增量是\(1\),那麼就是\(ab\)了;增量是\(2\)的話,好像無論如何都需要再來一次確定下一位是\(y\)還是\(a\),於是徹底自閉了;
果不其然我是垃圾,我們直接問\(s+a+a,s+a+b,s+a+y,s+b\)就好了,如果增量是\(0\),那麼就是\(y\);增量是\(1\),那麼就是\(b\);如果增量是\(2\),那麼就是\(a\);這樣每次確定一位,最後一位需要兩次特殊處理一下就好了。
綜上所述,我是垃圾
**
#include "combo.h"
#include#define re register
std::string nw;int tot;
std::string s[5];
std::string guess_sequence(int n)
if(k==1)
if(k==2) nw+="a";
if(n==1)return nw;
if(nw!="a")s[++tot]="a";
if(nw!="b")s[++tot]="b";
if(nw!="x")s[++tot]="x";
if(nw!="y")s[++tot]="y";
for(re int i=2;iif(press(nw+s[1])==n) nw+=s[1];
else
return nw;
}//g++ grader.cpp combo.cpp -o combo -o2 -lm -std=c++11
IOI2018 組合動作 題解
傳送門 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 我們可以...
IOI2018 機械娃娃
看到的時候感到很不可做,因為所有的開關都要狀態歸零。因此可以得到兩分的好成績。然後 yhx 12243 說 這不是線段樹優化建圖嗎?於是我獲得了啟發,會做了 還不是和上次一樣,通過提示做出這種互動題的?我還是太菜了 以下魔改自我的思考過程 一開始想對每乙個觸發器配一組開關決策下一步,然後聽說用線段樹...
IOI2018 排座位 線段樹
ioi2018seat 這題思路真的很神。原題編號從0開始,很不舒服,我們按從1開始的講。發現只需要判斷 1,i 這些數是否組成了乙個矩陣。那麼我們能不能用線段樹,第i個葉子節點存前i個數的資訊來判斷前i個數能否組成矩陣呢?有的人可能會想到第i個葉子節點維護前i個數中最左上的點和最右下的點,判斷時直...