本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。
Ina 家客廳有 16 個紙箱,標號 $1, 2, \dots, 16$,其中 14 個紙箱內什麼都沒有,剩下兩個紙箱中一個紙箱裡面住著一隻小章魚,另一個紙箱內有一個每天固定產出一片餅乾的餅乾傳送門。因為 Ina 懶得去打開紙箱一個一個檢查每個紙箱內部有什麼,所以 Ina 並不知道每個紙箱的內容物。
Ina 知道小章魚最喜歡吃餅乾了,為了避免餅乾被吃,Ina 決定將一些箱子移入儲藏室裡。也就是說, Ina 會決定哪些箱子要被放在客廳,哪些箱子要被移入儲藏室,只要有小章魚的箱子與有餅乾傳送門的箱子在不同房間內(一個在客廳另一個在儲藏室),餅乾就不會被吃掉。Ina 雖然不知道每個箱子的內容物有什麼,但祂可以利用神力預測未來,知道對於每種選擇方法餅乾會不會被吃掉。不過因為利用神力很累,Ina 想要請你幫忙祂找到一種測試方法,可以不要預測太多次就可以找到一種餅乾不被吃掉的方法。
更完整地說,有一個隱藏的長度為 16 的字串,其中一個字元是 1、一個字元是 2 、剩下 14 個字元是 0。每次可以詢問一個集合,judge 會告訴你這個集合裡面是否出現 $1$ 與 $2$ 恰好其中一個,要求你在盡量少次詢問內找到出現 $1$ 與 $2$ 恰好其中一個的集合。
詳細細節與評分方式請見後續段落。
你的程式需要在一開始使用前置處理器引入 lib1436.h,詳細請參考範例實作。
你需要完成以下的一個函式:
void onexor();
每次呼叫 onexor,你可以呼叫以下函式若干次:
string Partition(string part);
part 為一個長度為 16 的 01 字串,代表你想詢問的選擇方法,其中 part 的第 $i$ 個字元如果為 1 代表將編號 $i$ 的箱子移入儲藏室,如果為 0 代表將編號 $i$ 的箱子留在客廳。QAQ 與 WAH 其中一個,如果回傳為 QAQ 代表這樣的選擇方法餅乾會被吃掉,如果回傳為 WAH 代表這樣的選擇方法餅乾不會被吃掉。onexor $Q$ 次呼叫中,Partition 總共最多只能呼叫 $5 \times 10^ 5$ 次WAH,judge 會認定該次測試成功,請在 onexor return 前不要再呼叫 Partition 函式。onexor 被呼叫兩次,第一次呼叫小章魚在編號 $1$ 的箱子,餅乾在編號 $2$ 的箱子,第二次呼叫小章魚在編號 $3$ 的箱子,餅乾在編號 $4$ 的箱子,那麼一個可能的互動為:
| 評測程式端 | 參賽者程式端 |
|---|---|
呼叫 onexor()。 | |
呼叫 Partition("1100000011110000")。 | |
回傳 QAQ。 | |
呼叫 Partition("1000000000000000")。 | |
回傳 WAH。 | |
onexor() 函式 return。 | |
呼叫 onexor()。 | |
呼叫 Partition("0010000000000000")。 | |
回傳 WAH。 | |
onexor() 函式 return。 |
Partition 在該筆測資中總共被呼叫幾次,則該筆測資的分數根據以下方式給分,你的得分為所有測資的分數的最小值。
令 $K$ 為最小滿足 $S \le \lceil Q \times (\sqrt K + \frac {e} {50}) \rceil$ 的正整數,
範例評分程式有分三種測試模式,第一行請輸入一個數字 $x$ $ (1 \le x \le 3)$ 來代表要使用哪一種測試模式。
如果 $x = 1$,接下來請輸入一個正整數 $Q$,代表 onexor 總共被呼叫幾次。
接著輸入 $Q$ 行,每行為一個長度為 $16$ 的字串,字串由 $14$ 個 0,$1$ 個 1,$1$ 個 2 構成,字串第 $i$ 個字元代表編號 $i$ 的紙箱內是:沒有內容物、有小章魚、有餅乾傳送門。
如果 $x = 2$,不用再輸入任何內容,範例評分程式會自動幫你測試 $10^ 5$ 筆從所有可能的組合均勻隨機挑出的測試資料。
如果 $x = 3$,請輸入一個長度為 16 的字串,字串由 14 個 0,1 個 1,1 個 2 構成,字串第 $i$ 個字元代表編號 $i$ 的紙箱內是:沒有內容物、有小章魚、有餅乾傳送門,範例評分程式會幫你測試這個資料 $10^ 5$ 次。
如果沒有任何互動格式錯誤,範例評分程式會輸出一行:
Accepted: Q S r
其中 $Q$ 為 onexor 總共被呼叫了幾次,$S$ 為 Partition 總共被呼叫了幾次,$r$ 為 $\frac S Q$。
1 2 1200000000000000 0020000010000000
Accepted: 2 4 2.000000
由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。
onexor.exe,請直接用命令列執行該檔案。#include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。| No. | Testdata Range | Constraints | Score |
|---|---|---|---|
| 1 | 0~79 | 無特別限制 | 100 |