TopCoder

abcabcabc
有人要寫 p6 嗎 > <

User's AC Ratio

16.7% (2/12)

Submission's AC Ratio

6.0% (3/50)

Tags

Description

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

地板上有 $n$ 個磁磚,從左到右排成一排,每個磁磚可以用一個數字代表它的顏色,一開始每個磁磚的顏色可能是 1 或 2。我們稱這些磁磚是美麗的若符合以下兩個條件:

  • 兩種顏色的磁磚數量一樣多。
  • 對於所有 $1 \leq i \leq n$,前 $i$ 個磁磚中顏色 1 的磁磚數量不小於顏色 2 的磁磚數量。

舉例來說,若 $n = 6$ 時,1 1 2 2 1 2 是美麗的,但 1 2 2 1 1 2、1 2 1 1 1 2 都不是。

現在你的目標是要判斷磁磚初始的樣子是不是美麗的,然而你並不知道這些磁磚的樣子,也不知道 $n$ 的大小,你唯一可以做的事情是在第一塊磁磚上面擺上一隻機器人,且一開始機器人身上會顯示數字 $1$。機器人可以讀取一些資訊,你可以藉由這些資訊決定機器人要如何移動,並讓機器人經過一系列的移動後判斷出答案。更清楚來說,機器人在移動前會讀取三個變數 $\text{current\_color}, \text{current\_state}$ 以及 $\text{wall}$,代表的意義如下:

  • $\text{current\_col}$:目前機器人所在的磁磚顏色。
  • $\text{current\_state}$:目前機器人身上顯示的數字。
  • $\text{wall}$:該值會是介於 $1$ 到 $3$ 的正整數。若該值為 $1$ 則代表目前機器人在最左邊的磁磚,若該值為 $2$ 則代表目前機器人在最右邊的磁磚,否則代表都不是。

讀取完這些資訊後,機器人會藉由這些資訊以及你設定的規則決定出三個變數 $\text{changed\_color}, \text{changed\_state}$ 以及 $\text{action}$,並依序進行以下事項:

  • 將目前所在磁磚的顏色改成 $\text{changed\_color}$。
  • 將機器人顯示的數字改成 $\text{changed\_state}$。
  • 藉由 $\text{action}$ 決定出要如何移動。具體來說,該值會是介於 $1$ 到 $5$ 的正整數。若該值為 $1$ 則機器人會往左移動一格,若該值為 $2$ 則機器人會往右移動一格,若該值為 $3$ 則機器人會停在原地,若該值為 $4$ 則機器人會發出結束的通知並宣告磁磚是美麗的,若該值為 $5$ 則機器人會發出結束的通知並宣告磁磚是不美麗的。

現在請幫機器人設定好規則,在使用至多 $k$ 種顏色且身上所顯示的數字至多為 $40$ 的情況下判斷出答案吧!

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

Implementation Details

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

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

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

void build(int k);
  • 在一筆測試資料中,build 會被呼叫恰一次。
  • k 代表可以使用的顏色上界。

你可以呼叫以下函式:

void add_rule(int current_color, int current_state, int wall, int changed_color, int changed_state, int action);
  • 引數 $\text{current\_color}$ 必須為一個介於 $1$ 到 $k$ 的正整數。
  • 引數 $\text{current\_state}$ 必須為一個介於 $1$ 到 $40$ 的正整數。
  • 引數 $\text{wall}$ 必須為一個介於 $1$ 到 $3$ 的正整數。
  • 引數 $\text{changed\_color}$ 必須為一個介於 $1$ 到 $k$ 的正整數。
  • 引數 $\text{changed\_state}$ 必須為一個介於 $1$ 到 $40$ 的正整數。
  • 引數 $\text{action}$ 必須為一個介於 $1$ 到 $5$ 的正整數。
  • 若以上條件有一個沒有滿足,你將會獲得 Wrong Answer [1]。
  • 當呼叫此函數後,若機器人讀取到的資訊與傳入的 $\text{current\_color}, \text{current\_state}$ 以及 $\text{wall}$ 完全相同,那機器人決定的變數會是你傳入的 $\text{changed\_color}, \text{changed\_state}$ 以及 $\text{action}$。
  • 任兩次呼叫的 $\text{current\_color}, \text{current\_state}$ 以及 $\text{wall}$ 不能完全相同,否則你會獲得 Wrong Answer [2]。

當 build 函式成功結束後,評測系統會開始模擬 $t$ 個測試資料,若模擬中遇到了以下情況之一,模擬就會停止且回傳對應的 Wrong Answer 結果:

  • 若機器人沒有目前獲得的資訊該如何行動的規則,則你會獲得 Wrong Answer [3]。
  • 若機器人在最左邊的磁磚但它會往左走,你會獲得 Wrong Answer [4]。
  • 若機器人在最右邊的磁磚但它會往右走,你會獲得 Wrong Answer [5]。
  • 若機器人的移動總步數超過 $10 \times n^ 3$,你會獲得 Wrong Answer [6],其中 $n$ 為目前測資的磁磚數量。注意到你不會事先得知 $n$ 的大小。
  • 若機器人回答的結果錯誤,你會獲得 Wrong Answer [7]。

若對於每一種磁磚機器人都順利判斷出正確的答案,那你的程式將依照 Scoring 中的敘述評分。

Example

假設 $k = 3$,一個可能被判斷為 Accepted 的範例互動狀況如下:


評測程式端 參賽者程式端
呼叫 build(3)。
呼叫 add_rule(1, 1, 1, 1, 1, 4)。
呼叫 add_rule(2, 1, 1, 1, 1, 5)。

Constraints

  • $k \in \lbrace 2, 3 \rbrace$
  • $1 \leq t \leq 1000$
  • $2 \leq n \leq 30$
  • 保證一筆測資的 $n^ 3$ 總和不超過 $10^ 6$。

Scoring

若你該子任務有至少一個測資沒有獲得 Accepted,那你該筆子任務的得分為 $0$ 分,否則令 $S$ 為你所有呼叫的 add_rule 中 $\text{current\_state}$ 的最大值,則會按照以下方式給分:

子任務一

  • 若 $S \geq 17$,你會獲得 $8$ 分。
  • 若 $S \leq 16$,你的分數會根據以下表格給分:
$S$$\leq 3$$4$$5$$6$$7$$8$$9$$10$$11$$12$$13$$14$$15$$16$
分數$45$$40$$35$$30$$28$$26$$24$$22$$20$$19$$18$$17$$16$$15$

子任務二

  • 若 $S \geq 10$,你會獲得 $0$ 分。
  • 若 $S \leq 9$,你的分數會根據以下表格給分:
$S$$\leq 3$$4$$5$$6$$7$$8$$9$
分數$55$$45$$25$$16$$12$$8$$4$

Input Format

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

首先第一行輸入一個正整數 $k$,代表可以使用的顏色數量,接下來第二行輸入一個正整數 $t$,代表測試資料的數量。接下來每筆測試資料都以下列格式輸入:

  • line $1$: $n$
  • line $2$: $a_1$ $a_2$ $\ldots$ $a_n$

其中 $n$ 為磁磚的數量,$a_i$ 為第 $i$ 塊磁磚的初始顏色。

Output Format

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

若你在過程中獲得 Wrong Answer [x],那範例評分程式會輸出相同的文字並直接結束。否則會在第一行輸出 Accepted: m,其中 $m$ 為你所有呼叫的 add_rule 中 $\text{current\_state}$ 的最大值。

另外,在模擬的過程中,範例評分程式會輸出每一步的流程。若不想要輸出完整的流程只要將 grader.cpp 中第 8 行的 #define DETAILED 移除即可。

Sample Input 1

3
3
4
1 1 2 2
6
1 1 2 1 2 2
6
1 2 2 1 1 2

Sample Output 1

Accepted: 3

Hints

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

  • 如果你的系統是 Linux 或 MacOS,你可以直接執行 compile.sh 編譯你的程式,編譯結果會是 parentheses.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 範例測資 0
2 0~30 $k = 3$ 45
3 31~60 $k = 2$ 55

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 1048576 65536 1 2
1 1000 1048576 65536 2
2 1000 1048576 65536 2
3 1000 1048576 65536 2
4 1000 1048576 65536 2
5 1000 1048576 65536 2
6 1000 1048576 65536 2
7 1000 1048576 65536 2
8 1000 1048576 65536 2
9 1000 1048576 65536 2
10 1000 1048576 65536 2
11 1000 1048576 65536 2
12 1000 1048576 65536 2
13 1000 1048576 65536 2
14 1000 1048576 65536 2
15 1000 1048576 65536 2
16 1000 1048576 65536 2
17 1000 1048576 65536 2
18 1000 1048576 65536 2
19 1000 1048576 65536 2
20 1000 1048576 65536 2
21 1000 1048576 65536 2
22 1000 1048576 65536 2
23 1000 1048576 65536 2
24 1000 1048576 65536 2
25 1000 1048576 65536 2
26 1000 1048576 65536 2
27 1000 1048576 65536 2
28 1000 1048576 65536 2
29 1000 1048576 65536 2
30 1000 1048576 65536 2
31 1000 1048576 65536 3
32 1000 1048576 65536 3
33 1000 1048576 65536 3
34 1000 1048576 65536 3
35 1000 1048576 65536 3
36 1000 1048576 65536 3
37 1000 1048576 65536 3
38 1000 1048576 65536 3
39 1000 1048576 65536 3
40 1000 1048576 65536 3
41 1000 1048576 65536 3
42 1000 1048576 65536 3
43 1000 1048576 65536 3
44 1000 1048576 65536 3
45 1000 1048576 65536 3
46 1000 1048576 65536 3
47 1000 1048576 65536 3
48 1000 1048576 65536 3
49 1000 1048576 65536 3
50 1000 1048576 65536 3
51 1000 1048576 65536 3
52 1000 1048576 65536 3
53 1000 1048576 65536 3
54 1000 1048576 65536 3
55 1000 1048576 65536 3
56 1000 1048576 65536 3
57 1000 1048576 65536 3
58 1000 1048576 65536 3
59 1000 1048576 65536 3
60 1000 1048576 65536 3