Mehmet 喜愛電腦遊戲,過去 10 小時一直在玩 Immortal Grasshopper。Immortal Grasshopper 是一款電腦遊戲,你使用按鈕控制自己的角色──一隻精通空手道的蚱蜢。你的對手是一隻由電腦控制的螞蟻。
蚱蜢總共能施展 $S$ 種不同的攻擊($1 \le S \le 4$)。這些攻擊以字母表的前 $S$ 個字母命名。例如:
- $S=2$:攻擊名稱為 $A,B$。
- $S=4$:攻擊名稱為 $A,B,C,D$。
每次命中對手的攻擊造成 $1$ 點傷害。
雖然你知道遊戲規則,但 Mehmet 玩了 10 小時後睡著了,沒有人能教你操作方式。你在桌上找到一個有 $N$ 個按鈕的控制器(按鈕編號從 $0$ 到 $N-1$)。玩了一會兒後,你發現每個按鈕都能施展 $S$ 種攻擊中的一種,但不知道各個按鈕的作用。幸好,藉由第一個按鈕上的貼紙,你知道它會施展 $A$ 型攻擊。此外,你知道每種攻擊都至少對應一個按鈕。
你的任務是透過玩這款遊戲,確定控制器上所有按鈕各自施展的攻擊種類。
你以下述方式玩遊戲。為了攻擊對手螞蟻,你使用稱為「連招」的連續按鈕組合。連招的運作方式如下:
- 依序按下任意數量的按鈕來建立連招。
- 在連招中,可以以任意順序按下按鈕。
- 在連招中,同一個按鈕可以按下多次。
- 連招的長度最多為 $400$。
遊戲會接收你的操作,最後顯示你造成的總傷害。
連招對螞蟻造成的傷害以下述方式計算。以 $t(X)$ 表示在字母順序中緊接在攻擊 $X$ 後面的攻擊。對最後一個字母代表的攻擊,將 $t(X)$ 定義為攻擊 $A$。例如:
- $S=4$ 時:$t(A)=B,t(B)=C,t(C)=D,t(D)=A$。
- $S=2$ 時:$t(A)=B,t(B)=A$。
對手螞蟻會用狡猾的手段擋住你的部分攻擊。更精確地說,若你最後一次成功(未被擋住)並造成傷害的攻擊為 $X$,而下一次使用的攻擊為 $t(X)$,螞蟻就會擋住這次 $t(X)$ 攻擊,你不會造成傷害。若它無法擋住,你就會對螞蟻造成 $1$ 點傷害(第一次攻擊一定會造成傷害)。
你的目標是使用最少的連招總次數,找出並回報所有按鈕各自施展的攻擊。
實作細節
你需要實作以下函式:
std::string olumsuz_cekirge(int N, int S)
- $N$ 表示控制器上的按鈕數量。
- $S$ 表示遊戲中不同攻擊種類的數量。
- 此函式應回傳一個長度為 $N$ 的字串,表示各按鈕所對應的攻擊。
過程中,你可以使用以下 kombo 函式:
int kombo(std::vector<int> buton)
- 每次呼叫
olumsuz_cekirge期間,你最多可以呼叫kombo函式 $400$ 次。 - 陣列
buton指定你想在連招中使用的按鈕編號。 - 陣列
buton中的值必須是從 $0$ 到 $N-1$ 的整數。 - 陣列
buton的長度最多為 $400$。
每筆測試中,你需要解決 $T$ 個具有相同 $N$ 與 $S$ 值的獨立情境。對每個獨立情境,會呼叫一次 olumsuz_cekirge 函式。
資料範圍
- $1 \le T \le 100$。
- $4 \le N \le 400$。
- $1 \le S \le 4$。
- 評測程式不具適應性。更精確地說,輸入在呼叫
olumsuz_cekirge函式之前就已固定,且不會在操作期間改變。
子任務
若在任一情境中,以不符合上述要求的參數呼叫 kombo 函式,或 olumsuz_cekirge 函式回傳錯誤結果,第 $i$ 個子任務的得分為 $0$。否則,得分等於以下公式:
$$P_i \times \min\left(1,\left(\frac{400-q}{400-Q_i}\right)^3\right)$$
- $P_i$ 表示第 $i$ 個子任務可獲得的總分。
- $q$ 表示第 $i$ 個子任務所有測試中的各情境裡,呼叫
kombo函式次數的最大值。 - $Q_i$ 的值列於子任務說明中。
| 子任務 | 分數 | 額外限制 | 相依子任務 |
|---|---|---|---|
| 1 | 1 | $S=1,Q_1=0,P_1=1$ | — |
| 2 | 15 | $S=2,Q_2=50,P_2=15$ | — |
| 3 | 40 | $S=3,Q_3=80,P_3=40$ | — |
| 4 | 44 | $S=4,Q_4=103,P_4=44$ | — |
範例
olumsuz_cekirge(6, 3)
範例中,各按鈕對應的攻擊依序為 ABCBBA,因此此函式應回傳這個字串。
kombo([0, 1, 2])
上述呼叫回傳 $2$。此連招的攻擊為 $ABC$。第一次 $A$ 攻擊命中。$B$ 攻擊被擋住。由於最後一次造成傷害的攻擊為 $A$,螞蟻無法擋住 $C$ 攻擊,因此受到傷害。
kombo([0, 0, 0])
上述呼叫回傳 $3$。此連招的攻擊為 $AAA$。所有 $A$ 攻擊都造成傷害。
kombo([5, 1, 3, 2, 2, 0])
上述呼叫回傳 $3$。此連招的攻擊為 $ABBCCA$。第一次 $A$ 攻擊命中。$B$ 攻擊被擋住。由於最後一次命中的攻擊仍為 $A$,第二次 $B$ 攻擊也被擋住。第一次與第二次 $C$ 攻擊造成傷害。由於最後一次命中的攻擊為 $C$,對手螞蟻預期會出現 $A$,因此最後一次 $A$ 攻擊被擋住。
kombo([2, 2, 1])
上述呼叫回傳 $3$。此連招的攻擊為 $CCB$。所有攻擊都造成傷害。
範例評測程式
範例評測程式以下列格式讀取輸入,其中 $C_i$ 為長度為 $N$ 的字串,表示第 $i$ 個情境中各按鈕的隱藏攻擊:
$$\begin{array}{l}T\ N\ S\\C_1\\C_2\\\ldots\\C_T\end{array}$$
它會對每個情境印出以下內容:若正確解決該情境,印出使用的操作總次數。若有任何錯誤,印出以下其中一則錯誤訊息:
Yanlis cevap (Wrong answer) Buton asildi (Button limit exceeded) Yanlis buton (Invalid button) Kombo asildi (Combo limit exceeded)
Yanlis cevap (Wrong answer):若任何按鈕的答案有誤,印出此訊息。Buton asildi (Button limit exceeded):若單次呼叫kombo函式使用超過 $400$ 個按鈕,回傳此訊息。Yanlis buton (Invalid button):若某次呼叫kombo函式中的某個按鈕編號不是介於 $0$ 與 $N-1$ 之間的數字,回傳此訊息。Kombo asildi (Combo limit exceeded):若單次呼叫olumsuz_cekirge函式期間呼叫kombo函式超過 $400$ 次,回傳此訊息。