本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。
在 Squid Game 的殘酷競賽中,玩家們被迫參與一場場危險又充滿心理博弈的遊戲。而其中一個關卡「猜石頭之謎」,更是以其極高的難度與精密策略聞名。
你面前擺放著一排石頭,每顆石頭的顏色可能是黑色或白色,但具體顏色已被隱藏。玩家必須設法在有限的 Cost 內猜出所有石頭的顏色。你每次可以選擇一些石頭進行詢問,系統會回應該集合中黑色石頭的數量。然而,每次詢問都會產生 Cost,我們定義每次詢問的 $\text{Cost} = \frac{1}{|S|}$,其中 $|S|$ 是詢問的石頭集合大小。當 Total Cost 超過 10 時,你將立即被淘汰。
你的任務是設計一個策略,在限制內找出所有石頭的正確顏色,並向系統提交答案。若答案正確且 Total Cost 小於或等於 10,挑戰成功;若答案錯誤或 Total Cost 超過限制,挑戰失敗。
詳細細節與評分方式請見後續段落。
你的程式需要在一開始使用前置處理器引入 lib0934.h,詳細請參考範例實作。
你需要完成以下的一個函式:
std::vector<int> guessstone(int n);
guessstone 會被呼叫恰一次。n 代表石頭的總數。你可以呼叫以下函式:
int query(std::vector<int> S);
query 不得被呼叫超過 $\textbf{20\ 000}$ 次。如果任意一個條件沒有被滿足,你的程式會被判斷為 Wrong Answer 並且獲得 0 分,否則,你的程式將依照 Scoring 中的敘述評分。
 
| 評測程式端 | 參賽者程式端 | 
|---|---|
呼叫 guessstone(4)。 |     |
呼叫 query({0})。 |   |
回傳 1。 |   |
呼叫 query({1, 2})。 |   |
回傳 0。 |   |
呼叫 query({3})。 |   |
回傳 1。 |   |
回傳 {1, 0, 0, 1}。 |   
query 所造成的總 Cost 為 $C$,你的得分 $S$ 由下列方式計算: 
範例評分程式以下列方式輸入:
其中若第 $i$ 顆石頭為黑色,則 $a_i = 1$,否則 $a_i = 0$。
範例評分程式以下列方式輸出:
如果你的程式被判斷為 Accepted,範例評分程式會輸出 Accepted: C,其中 C 為呼叫 query 所造成的總 Cost。接著輸出一行,該行有 $n$ 個整數,其中第 $i$ 個整數為你回傳的第 $i$ 顆石頭的顏色,若為黑色則該數為 1,否則為 0。
如果你的程式被判斷為 Wrong Answer,範例評分程式會輸出 Wrong Answer: MSG,其中 MSG 以及其代表的意思為以下列表的其中一個:
S must be nonempty: query 函式傳入的 $S$ 為空。elements in S must be between 0 and n-1: query 函式傳入的 $S$ 內有不在 $0$ 至 $n-1$ 範圍內的數。duplicate elements in S: query 函式傳入的 $S$ 內有重複的數。Too many queries: query 的呼叫次數過多。invalid answer:回傳的陣列長度不是 $n$,或是回傳的陣列元素不是 0 或 1。如果有多個原因,範例評分程式只會輸出任何一個。
另外請注意,範例評分程式並不會幫你檢查你回傳的任何數值是否是正確的。
4 1 0 0 1
由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。
rocks.exe,請直接用命令列執行該檔案。-static 參數移除,其餘與 Linux 相同。#include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。| No. | Testdata Range | Constraints | Score | 
|---|---|---|---|
| 1 | 0 | 範例測資 | 0 | 
| 2 | 0~30 | 無額外限制 | 100 |