TopCoder

User's AC Ratio

78.3% (18/23)

Submission's AC Ratio

14.7% (30/204)

Tags

Description

本題為互動題,限用 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$ 恰好其中一個的集合。

Judge 是 Non-adaptive,也就是說答案是預先設定好的。

詳細細節與評分方式請見後續段落。

Implementation Details

本題請不要使用標準輸入輸出流,不過你仍然可以輸出除錯訊息至標準錯誤流(stderr)。

你的程式需要在一開始使用前置處理器引入 lib1436.h,詳細請參考範例實作。

你需要完成以下的一個函式:

void onexor();
  • 在一筆測資中,該函數會被呼叫恰好 $Q = 10^ 5$ 次。
  • 該函數沒有任何回傳值

每次呼叫 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 函式。

Example

假設該筆測資內 onexor 被呼叫兩次,第一次呼叫小章魚在編號 $1$ 的箱子,餅乾在編號 $2$ 的箱子,第二次呼叫小章魚在編號 $3$ 的箱子,餅乾在編號 $4$ 的箱子,那麼一個可能的互動為:


評測程式端 參賽者程式端
呼叫 onexor()。
呼叫 Partition("1100000011110000")。
回傳 QAQ。
呼叫 Partition("1000000000000000")。
回傳 WAH。
onexor() 函式 return。
呼叫 onexor()。
呼叫 Partition("0010000000000000")。
回傳 WAH。
onexor() 函式 return。

Constraints

  • $Q = 10^ 5$
  • 每筆測試中箱子數皆恰為 $16$

Scoring

若你有至少一個測資沒有獲得 Accepted,那你的得分為 0 分,否則對於一筆測資,令 $S$ 為 Partition 在該筆測資中總共被呼叫幾次,則該筆測資的分數根據以下方式給分,你的得分為所有測資的分數的最小值。

令 $K$ 為最小滿足 $S \le \lceil Q \times (\sqrt K + \frac {e} {50}) \rceil$ 的正整數,

  • 若 $K > 16$,那麼該筆測試為 0 分
  • 若 $16 \ge K \ge 5$,該筆測試為 10 分
  • 若 $K = 4$,該筆測試為 50 分
  • 若 $3 \ge K \ge 1$,該筆測試為 100 分

Input Format

範例評分程式有分三種測試模式,第一行請輸入一個數字 $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$ 次。

Output Format

如果沒有任何互動格式錯誤,範例評分程式會輸出一行:

Accepted: Q S r

其中 $Q$ 為 onexor 總共被呼叫了幾次,$S$ 為 Partition 總共被呼叫了幾次,$r$ 為 $\frac S Q$。

Sample Input 1

1
2
1200000000000000
0020000010000000

Sample Output 1

Accepted: 2 4 2.000000

Hints

由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。

  • 如果你的系統是 Linux 或 MacOS,你可以直接執行 compile.sh 編譯你的程式,編譯結果會是 onexor.exe,請直接用命令列執行該檔案。
  • 如果你的系統是 Windows,你有以下的選擇:
    1. 本地測試時加入 #include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。
    2. 將 compile.sh 的變數替換後直接於命令列執行,請注意你需要確保 g++ 在系統的環境變數 PATH 中。
    3. 如果你的電腦已經有 WSL (Windows Subsystem for Linux),你可以直接使用 WSL 並按照 Linux 的做法。
    4. 使用電腦教室的 Ubuntu(啟動時可以選擇系統)並按照 Linux 的做法。

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0~79 無特別限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 262144 65536 1
1 1000 262144 65536 1
2 1000 262144 65536 1
3 1000 262144 65536 1
4 1000 262144 65536 1
5 1000 262144 65536 1
6 1000 262144 65536 1
7 1000 262144 65536 1
8 1000 262144 65536 1
9 1000 262144 65536 1
10 1000 262144 65536 1
11 1000 262144 65536 1
12 1000 262144 65536 1
13 1000 262144 65536 1
14 1000 262144 65536 1
15 1000 262144 65536 1
16 1000 262144 65536 1
17 1000 262144 65536 1
18 1000 262144 65536 1
19 1000 262144 65536 1
20 1000 262144 65536 1
21 1000 262144 65536 1
22 1000 262144 65536 1
23 1000 262144 65536 1
24 1000 262144 65536 1
25 1000 262144 65536 1
26 1000 262144 65536 1
27 1000 262144 65536 1
28 1000 262144 65536 1
29 1000 262144 65536 1
30 1000 262144 65536 1
31 1000 262144 65536 1
32 1000 262144 65536 1
33 1000 262144 65536 1
34 1000 262144 65536 1
35 1000 262144 65536 1
36 1000 262144 65536 1
37 1000 262144 65536 1
38 1000 262144 65536 1
39 1000 262144 65536 1
40 1000 262144 65536 1
41 1000 262144 65536 1
42 1000 262144 65536 1
43 1000 262144 65536 1
44 1000 262144 65536 1
45 1000 262144 65536 1
46 1000 262144 65536 1
47 1000 262144 65536 1
48 1000 262144 65536 1
49 1000 262144 65536 1
50 1000 262144 65536 1
51 1000 262144 65536 1
52 1000 262144 65536 1
53 1000 262144 65536 1
54 1000 262144 65536 1
55 1000 262144 65536 1
56 1000 262144 65536 1
57 1000 262144 65536 1
58 1000 262144 65536 1
59 1000 262144 65536 1
60 1000 262144 65536 1
61 1000 262144 65536 1
62 1000 262144 65536 1
63 1000 262144 65536 1
64 1000 262144 65536 1
65 1000 262144 65536 1
66 1000 262144 65536 1
67 1000 262144 65536 1
68 1000 262144 65536 1
69 1000 262144 65536 1
70 1000 262144 65536 1
71 1000 262144 65536 1
72 1000 262144 65536 1
73 1000 262144 65536 1
74 1000 262144 65536 1
75 1000 262144 65536 1
76 1000 262144 65536 1
77 1000 262144 65536 1
78 1000 262144 65536 1
79 1000 262144 65536 1