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 调用期间,你最多可以调用 $400$ 次 kombo 函数。
  • 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{gathered}T\ N\ S\\C_1\\C_2\\\ldots\\C_T\end{gathered}$$

对于每个场景,评测程序会输出以下内容:如果正确解决了该场景,则输出使用的操作总数。如果出现错误,则输出以下错误信息之一:

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.