金铲铲模拟器
题目描述:
你正在进行一场《金铲铲》的对局。
游戏中共有 $m$ 种不同的弈子,每种弈子都有自己的费用和羁绊。你需要管理金币、等级、场上弈子以及备战席,并根据每回合出现的商店完成整场游戏。
本题中的所有行为均由游戏规则决定,不需要进行策略选择。
请你模拟 $n$ 个回合后,输出游戏结束时的状态。
弈子
共有 $m$ 种弈子,编号为 $1\sim m$。
第 $i$ 种弈子具有:
- 购买费用 $c_i$;
- $k_i$ 个羁绊。
每个羁绊由一个字符串表示。
玩家对同一种弈子的持有数量最多为 $3$。
当持有某种弈子的数量达到 $3$ 时,这三张弈子立即合成为一张二星弈子。
一星弈子的星级为 $1$,合成后的弈子的星级为 $2$。
同一种编号的弈子不能同时存在于场上。
等级与金币
游戏开始时,等级为 $1$,拥有 $G$ 枚金币。
当玩家处于等级 $i$ 时,升级到等级 $i+1$ 需要花费 $up_i$ 枚金币,最高等级为 $LC$。
每个回合开始时,会获得一笔利息和额外金币。
若当前金币为 $G$,本回合额外获得 $x$ 枚金币,则获得金币后:
$$
G\leftarrow G+\min(5,\lfloor G/10\rfloor)+x
$$
随后,如果当前等级尚未达到 $LC$ 且金币不少于当前等级的升级费用,则立即升级一次,并支付相应费用。
场上与备战席
当前等级为 $level$ 时,场上最多可以存在 $level$ 名不同编号的弈子。
备战席最多可以存放 $k$ 张弈子。
备战席按照弈子进入的先后顺序排列。
新获得的弈子进入备战席末尾。
当需要从备战席中选择弈子时,总是优先检查位于最前面的弈子。
若该弈子当前不满足本次操作的要求,则将它重新放到备战席末尾,再继续检查下一张。
羁绊
对于每种羁绊,记录当前场上拥有该羁绊的弈子数量。
只要某个羁绊当前有至少一名场上弈子拥有,就认为该羁绊存在。
当一名弈子进入场上时,它所拥有的每一种羁绊数量均增加 $1$。
初始状态
游戏开始时:
- 等级为 $1$;
- 拥有 $G$ 枚金币;
- 编号为 $t$ 的一星弈子位于场上;
- 备战席为空。
弈子 $t$ 所拥有的所有羁绊均计入场上羁绊。
每回合流程
每回合会依次进行以下事件:
1. 获得金币;
2. 判断是否升级;
3. 若本回合升级,则进行一次特殊的上场操作;
4. 依次处理商店中的 $5$ 张弈子;
5. 回合结束时进行场上补位。
升级后的上场
若本回合成功升级,则升级完成后立即进行一次上场操作。
此时,从备战席当前的排列顺序开始检查。
对于一张弈子:
- 如果该编号的弈子已经在场上,则将它重新放到备战席末尾;
- 否则,如果它至少拥有一个当前已经存在的羁绊,则令它进入场上;
- 如果它既未在场上,又没有与当前场上羁绊产生联系,则将它重新放到备战席末尾。
一旦有弈子成功进入场上,本次操作立即结束。
本次操作至多使一名弈子进入场上。
商店
每回合商店会按照从左到右的顺序出现 $5$ 张弈子牌。
同一种弈子可以在同一回合的不同位置重复出现。
设当前商店中的弈子编号为 $id$。
当满足以下任意条件时,不会购买这张牌:
$$
G<c_{id}
$$
或
$$
这张牌已经升至二星
$$
对于能够购买的弈子,只要满足以下任意条件,就会购买:
- 该弈子拥有至少一个当前已经存在的羁绊;
- $c_{id}>3$。
否则不购买。
购买与合成
当决定购买某张弈子时,只有在以下条件至少满足一个时,购买才会成功:
$$
|备战席|<k
$$
或
$$
count_{id}=2, 其中 count_{id} 表示当前持有的弈子 id 的数量。
$$
购买成功后,支付对应费用,并使该弈子的持有数量增加 $1$。
若购买后持有数量仍小于 $3$,则将一张一星弈子加入备战席末尾。
若购买后恰好达到 $3$ 张,则立即完成合成。
合成时,备战席中所有编号为 $id$ 的弈子都会被移除。
若编号 $id$ 的弈子已经在场上,则直接将场上的它变为二星。
否则,将一张二星弈子加入备战席末尾。
回合结束时的补位
商店处理完成后,如果场上弈子数量少于当前等级,则进行补位。
补位时不考虑羁绊。
不断从备战席最前面检查弈子:
- 如果该编号已经在场上,则将这张弈子重新放到备战席末尾;
- 否则,这张弈子进入场上。
弈子进入场上后,其所有羁绊的数量各增加 $1$。
当上场一张奕子,或者备战席中已经没有可以处理的弈子时,本次补位结束。
输入格式:
第一行包含五个整数:
$$
n\quad m\quad k\quad G\quad LC
$$
分别表示:
- $n$:游戏回合数;
- $m$:弈子种类数;
- $k$:备战席容量;
- $G$:初始金币;
- $LC$:等级上限。
第二行包含 $LC$ 个整数:
$$
up_1,up_2,\ldots,up_{LC}
$$
其中 $up_i$ 表示从等级 $i$ 升到等级 $i+1$ 所需的金币。
接下来 $m$ 行,每行描述一种弈子。
第 $i$ 行包含:
$c_i \ k_i \ name_1 \ name_2 \ ... \ name_{k_i} $
其中:
- $c_i$ 表示弈子 $i$ 的费用;
- $k_i$ 表示弈子 $i$ 拥有的羁绊数量;
- $ name_1 ... name_{k_i}$ 表示它拥有的羁绊。
接下来一行包含一个整数:
$t$
表示初始位于场上的弈子编号。
接下来 $n$ 行描述每个回合。
每行包含:
$x\ a_1\ a_2\ a_3\ a_4\ a_5$
其中:
- $x$ 表示本回合额外获得的金币;
- $a_1,a_2,a_3,a_4,a_5$ 表示商店从左到右出现的 $5$ 张弈子牌。
输出格式:
第一行输出两个整数:
$level G$
分别表示游戏结束时的等级和金币。
接下来输出当前场上存在的所有羁绊。
每行输出:
$name count$
按照羁绊名称的字典序输出。
随后输出当前位于场上的所有弈子。
每行输出:
$id star$
其中 `star` 表示星级。
场上弈子按照编号从小到大输出。
最后输出备战席中的所有弈子。
每行输出:
$id star$
按照备战席当前从前到后的顺序输出。
若某一部分为空,则不输出任何内容。
数据范围:
对于所有测试数据:
$$
1\le n\le2\times10^5
$$
$$
1\le m\le2\times10^5
$$
$$
1\le k\le2\times10^5
$$
$$
1\le LC\le8
$$
$$
0\le G\le10^{18}
$$
$$
1\le up_i\le10^{18}
$$
$$
1\le c_i\le5
$$
$$
1\le k_i\le5
$$
每个羁绊名称长度不超过 $20$,仅包含大小写英文字母和数字。
保证所有弈子编号均在 $1\sim m$ 范围内。
样例输入:
(双击复制)3 4 2 10 3 8 10 20 1 1 Warrior 2 1 Mage 3 2 Warrior Mage 5 1 Assassin 1 2 3 2 4 1 3 0 4 4 2 1 1 3 3 4 2 4 1
样例输出:
(双击复制)2 0 Mage 1 Warrior 2 1 2 3 1 3 1时间限制: 1000ms
空间限制: 256MB
来源: 温州市计算机学会