QOJ.ac

QOJ

时间限制: 2.0 s 内存限制: 256 MB 总分: 100 交互

#9389. 运气

统计

这是一个交互式问题。

小莉娜(Lena)在玩一款电脑游戏。黑暗精灵圣骑士法尼亚(Fanya)是她在游戏中的角色。法尼亚即将进入地下城的下一层,继续她对抗混沌的冒险。

法尼亚为最近的战斗做了充分的准备:她的武器、盔甲、属性和内在特质本应让敌人毫无机会。然而,令莉娜惊讶的是,一个哥布林竟然设法击穿了她的盔甲,对她造成了少量伤害,随后法尼亚又突然没能击中一个笨重的巨魔。在游戏中,死亡是不可逆的,这让莉娜很担心:法尼亚还好吗?

莉娜玩这款游戏的时间足够长,所以她知道女主角可能拥有影响成功和不幸概率的内在特质。许多游戏事件可能有不同的结果,某些结果可能涉及不同的数值。例如,如果法尼亚用武器攻击怪物,她可能会完全错过怪物,或者击中它并造成一定伤害,或者造成暴击。这些结果的概率以及造成的伤害点数,特别受到以下四种内在特质的影响,女主角可以独立地拥有或不拥有这四种特质中的每一种:她是被诅咒的(doomed)、命运眷顾她(Fate smiles upon her)、她是厄运缠身的(cursed)、她是幸运的(lucky)。

不幸的是,目前法尼亚没有能让她确定自己拥有哪些内在特质的洞察药水。然而,或许可以通过间接的方法推断出来。

法尼亚的一些物品几乎没什么用。例如,她有 999 套相同的制箭工具,但真正的圣骑士是不使用箭矢的。制箭工具的描述写着它可以产生 $xdy \pm z$ 支箭。这意味着一个 $y$ 面的对称骰子(数字从 1 到 $y$)将被投掷 $x$ 次,将得到的 $x$ 个数值求和,并加上 $\pm z$($\pm$ 符号表示 $z$ 的符号始终存在)。例如,$1d6+2$ 意味着制箭工具将等概率地产生 3 到 8 支箭。描述 $2d4-1$ 表示将产生 1 到 7 支箭,且得到 4 支箭的概率是得到 7 支箭的 4 倍。

制箭工具的描述是针对没有内在特质的普通角色给出的。对于女主角,游戏机制进一步运作如下:

  1. 如果女主角是被诅咒的(doomed),箭的数量将根据描述计算三次:每次所有骰子都会重新投掷;结果取三次所得数值中的最小值。否则,结果保持不变。
  2. 如果命运眷顾女主角(Fate smiles upon her),箭的数量将根据上述算法计算三次:每次游戏取三次描述计算中的最小值(如果女主角是被诅咒的),或者仅取描述计算的结果(如果不是);结果取三次所得数值中的最大值。否则,结果保持不变。
  3. 如果女主角是厄运缠身的(cursed),箭的数量将根据上述算法计算两次:考虑被诅咒和命运眷顾的影响;结果取两次所得数值中的最小值。否则,结果保持不变。
  4. 最后,如果女主角是幸运的(lucky),箭的数量将根据上述算法计算两次:考虑其他三种内在特质的存在;结果取两次所得数值中的最大值。否则,结果保持不变。

例如,如果女主角拥有全部四种内在特质,描述 $2d4-1$ 意味着游戏需要投掷四面骰子 $2 \cdot 3 \cdot 3 \cdot 2 \cdot 2 = 72$ 次。

因此,莉娜可以使用制箭工具并观察每次使用后出现的箭矢数量。如何利用这一点来确定法尼亚的内在特质?莉娜把手放在键盘上,但停了下来,陷入了沉思。

解决莉娜问题的通用版本。给定制箭工具的描述,进行必要的实验并确定法尼亚这位黑暗精灵圣骑士拥有哪些内在特质。

交互

输入包含一个或多个测试用例。每个测试用例的描述以一行形式开始:“You have 999 fletchery sets (xdy±z).”。这里 $1 \le x \le 5$,$y$ 是数字 4, 6, 8, 12, 20 中的一个,$z$ 的值使得在所有可能的结果中,产生的箭矢数量至少为 1 且最多为 100。所有给定的数字均为整数。$z=0$ 的情况记为 $+0$。

读取描述后,程序可以选择进行 0 到 999 次制箭实验。要进行单次实验,请打印一行 “Create arrows.”。响应将是一行形式为 “You create t arrows.” 的内容,其中整数 $t$ 是产生的箭矢数量。

要打印测试用例的答案,请不要进行下一次实验,而是打印一行形式为 “Number of luck-related intrinsics: k.” 的内容。之后,打印 $k$ 行,每行对应法尼亚拥有的一个内在特质。使用以下形式:“You are doomed.”、“Fate smiles upon you.”、“You are cursed.” 和 “You are lucky.”。

在最后一个测试用例之后,输入会给出 “Exit.”。读取此行后,程序必须立即优雅地终止。

为了防止输出缓冲,请在打印每一行后刷新输出缓冲区:例如,在 C 或 C++ 中使用 fflush(stdout),在 Java 中使用 System.out.flush(),在 Pascal 中使用 flush(output),或在 Python 中使用 sys.stdout.flush()

每个测试包含 1 到 20 个测试用例。如果程序在三个或更多测试用例中打印了错误的内在特质集合,则该程序无法通过测试。特别地,示例中只有两个测试用例,因此程序只需遵守协议即可通过,即使它找到的两组内在特质都是错误的。在每个测试中,所有测试用例中的所有骰子投掷结果都是预先生成并保存的,评测程序只是重现请求的结果。

样例

输入 1

You have 999 fletchery sets (1d6+2).
You create 6 arrows.
You create 4 arrows.
You create 5 arrows.
You have 999 fletchery sets (2d4-1).
Exit.

输出 1

Create arrows.
Create arrows.
Create arrows.
Number of luck-related intrinsics: 2.
You are cursed.
You are lucky.
Number of luck-related intrinsics: 0.

说明

问题中描述的类似游戏机制被用于游戏《Ancient Domains Of Mystery》(ADOM) 的旧版本中。

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.