QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 256 MB Total points: 100

#20298. 不死蚱蜢

Statistics

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$ 次,回傳此訊息。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.