IOI2018 組合動作

2022-03-26 19:32:36 字數 1349 閱讀 2555

題目

我是垃圾;

最開始覺得可以三次問出第一位,之後還有\(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個數中最左上的點和最右下的點,判斷時直...