TopCoder

User's AC Ratio

92.9% (13/14)

Submission's AC Ratio

66.7% (14/21)

Tags

Description

本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。

在 Squid Game 的殘酷競賽中,玩家們被迫參與一場場危險又充滿心理博弈的遊戲。而其中一個關卡「猜石頭之謎」,更是以其極高的難度與精密策略聞名。

你面前擺放著一排石頭,每顆石頭的顏色可能是黑色白色,但具體顏色已被隱藏。玩家必須設法在有限的 Cost 內猜出所有石頭的顏色。你每次可以選擇一些石頭進行詢問,系統會回應該集合中黑色石頭的數量。然而,每次詢問都會產生 Cost,我們定義每次詢問的 $\text{Cost} = \frac{1}{|S|}$,其中 $|S|$ 是詢問的石頭集合大小。當 Total Cost 超過 10 時,你將立即被淘汰。

你的任務是設計一個策略,在限制內找出所有石頭的正確顏色,並向系統提交答案。若答案正確且 Total Cost 小於或等於 10,挑戰成功;若答案錯誤或 Total Cost 超過限制,挑戰失敗。

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

Implementation Details

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

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

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

std::vector<int> guessstone(int n);
  • 在一筆測試資料中,guessstone 會被呼叫恰一次。
  • n 代表石頭的總數。
  • 石頭的編號為 $0, 1, \ldots, n - 1$。
  • 回傳值必須為一個長度為 $n$ 的陣列,其中若第 $i$ 個石頭為黑色,則陣列第 $i$ 項為 1,否則為 0。

你可以呼叫以下函式:

int query(std::vector<int> S);
  • 引數 $S$ 需滿足 $|S| > 0$、$\forall s \in S, 0 \leq s < n$ 且 $S$ 內沒有相同的元素。
  • 回傳值是一個整數,表示該集合中黑色石頭的數量。
  • 每次詢問會增加 $\frac{1}{|S|}$ 的 Cost。
  • query 不得被呼叫超過 $\textbf{20\ 000}$ 次

如果任意一個條件沒有被滿足,你的程式會被判斷為 Wrong Answer 並且獲得 0 分,否則,你的程式將依照 Scoring 中的敘述評分。

Example

假設 $n = 4$,一個被判斷為 Accepted 的範例互動狀況如下:


評測程式端 參賽者程式端
呼叫 guessstone(4)
呼叫 query({0})
回傳 1
呼叫 query({1, 2})
回傳 0
呼叫 query({3})
回傳 1
回傳 {1, 0, 0, 1}

Constraints

  • $1 \leq n \leq 2000$
  • 石頭顏色不會隨著互動過程而改變。

Scoring

假設在所有測試資料中,你呼叫 query 所造成的總 Cost 為 $C$,你的得分 $S$ 由下列方式計算:

  • 如果 $C \leq 10$, $$S = 100$$
  • 否則, $$S = 0$$

Input Format

範例評分程式以下列方式輸入:

  • line $1$: $n$
  • line $2$: $a_0$ $a_1$ $\ldots$ $a_{n - 1}$

其中若第 $i$ 顆石頭為黑色,則 $a_i = 1$,否則 $a_i = 0$。

Output Format

範例評分程式以下列方式輸出:

如果你的程式被判斷為 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。

如果有多個原因,範例評分程式只會輸出任何一個。

另外請注意,範例評分程式並不會幫你檢查你回傳的任何數值是否是正確的。

Sample Input 1

4
1 0 0 1

Sample Output 1


        

Hints

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

  • 如果你的系統是 Linux,你可以直接執行 compile.sh 編譯你的程式,編譯結果會是 rocks.exe,請直接用命令列執行該檔案。
  • 如果你的系統是 MacOS,你需要將 compile.sh 當中的 -static 參數移除,其餘與 Linux 相同。
  • 如果你的系統是 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

IOICamp 2025 Day5 pK

Subtasks

No. Testdata Range Constraints Score
1 0 範例測資 0
2 0~30 無額外限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 2000 1048576 65536 1 2
1 2000 1048576 65536 2
2 2000 1048576 65536 2
3 2000 1048576 65536 2
4 2000 1048576 65536 2
5 2000 1048576 65536 2
6 2000 1048576 65536 2
7 2000 1048576 65536 2
8 2000 1048576 65536 2
9 2000 1048576 65536 2
10 2000 1048576 65536 2
11 2000 1048576 65536 2
12 2000 1048576 65536 2
13 2000 1048576 65536 2
14 2000 1048576 65536 2
15 2000 1048576 65536 2
16 2000 1048576 65536 2
17 2000 1048576 65536 2
18 2000 1048576 65536 2
19 2000 1048576 65536 2
20 2000 1048576 65536 2
21 2000 1048576 65536 2
22 2000 1048576 65536 2
23 2000 1048576 65536 2
24 2000 1048576 65536 2
25 2000 1048576 65536 2
26 2000 1048576 65536 2
27 2000 1048576 65536 2
28 2000 1048576 65536 2
29 2000 1048576 65536 2
30 2000 1048576 65536 2