uoj#P657. 【ULR #2】全是 AI 的比赛

【ULR #2】全是 AI 的比赛

这是一道提交答案题。

为了使得自己的 Rating 看起来不像改出来的。超级管理员 Skip 蚤决定举办几场比赛刷 Rating。

为了安全起见,这几场比赛除了超级管理员 Skip 蚤自己以外全是 AI。

这几场比赛不是传统赛制的比赛,它遵循如下所述的规则。

共 $n$ 名玩家,其中,Skip 蚤是 $1$ 号玩家,按顺时针序排列。第 $i$ 名玩家初始时有等级 $a_i$ 和体力 $b_i$,以及能量 $p_i$,初始时 $p_i=0$。

游戏至多进行 $T=10^4$ 轮,每轮按 $1\sim n$ 顺序执行每个存活玩家的回合。在一个回合中,若玩家 $A$ 当前等级为 $a$,能量为 $p$,他可以执行以下两种操作之一或什么也不干:

  • 选择一名存活的其它玩家 $B$,使玩家 $B$ 的能量增加 $k$,这里要求 $1\leq k\leq a$。
  • 选择一名存活的其它玩家 $B$,对玩家 $B$ 造成 $k$ 点伤害,即使玩家 $B$ 体力减少 $k$,这里要求 $1\leq k\leq a+p$,且随后玩家 $A$ 能量 $p$ 清零。若玩家 $B$ 体力减少到 $0$ 以下,视为玩家 $A$ 击杀了玩家 $B$,玩家 $A$ 的等级会增加上玩家 $B$ 的等级。

当场上只有一名玩家时,视为该玩家获胜。获胜的玩家将获得 Rating $8000$ 的奖励。

Skip 蚤希望在 $T$ 轮内获胜。同时,它希望损失的体力尽量小。你可以认为初始时 Skip 蚤($1$ 号玩家)的体力是无穷大。

Skip 蚤还要去对付跳蚤国王,所以,它委托你帮忙,希望你代打这几场比赛。

AI 描述

在该游戏中,玩家 $2\sim n$ 都是 AI,遵循以下策略行动:

对于 $i$ 号玩家,$j\neq i$ 号玩家对它会有一个威胁度 $c_{i,j}$($0\leq c_{i,j}\leq M$)。初始时的 $c_{i,j}$ 给定。

在每个回合中,$i$ 号玩家按如下策略行动:若存在 $c_{i,j}+a_j^2\geq B_i$,则选择 $c_{i,j}+a_j^2$ 最大的 $j$ 号玩家(有多个选择 $i$ 号玩家顺时针序上一个),对该玩家造成尽可能大的伤害;否则若存在 $c_{i,j}+a_j^2\leq A_i$ ,则选择 $c_{i,j}+a_j^2$ 最小的 $j$ 号玩家(有多个选择 $i$ 号玩家顺时针序下一个),为该玩家增加尽可能多的能量;否则什么都不会做。这里 $0\leq A_i < B_i$。

若 $j$ 号玩家攻击了 $i$ 号玩家并造成 $k$ 点伤害,会令 $c_{i,j}$ 变为 $\min(c_{i,j}+P_i+k,M)$;若 $j$ 号玩家为 $i$ 号玩家增加了 $k$ 点能量,会令 $c_{i,j}$ 变为 $\max(c_{i,j}-Q_i-k,0)$。

输入格式

本题为提交答案题。所有输入数据 D1.in ~ D5.in 见输入数据下载。

第一行输入三个正整数 $n,M,maxS$。

接下来一行输入 $n$ 个正整数,第 $i$ 个为 $a_i$。

接下来一行输入 $n-1$ 个正整数,第 $i$ 个为 $b_{i+1}$。

接下来 $2(n-1)$ 行,第 $2i-1$ 行依次输入 $n-1$ 个整数 $c_1,c_2,\ldots,c_i,c_{i+2},\ldots,c_n$,第 $2i$ 行输入四个整数 $A_i,B_i,P_i,Q_i$。

输出格式

对于每组数据,你需要输出你每一轮的行动方案。针对给定的输入数据,你需要分别提交 D1.out ~ D5.out。

第一行输出一个正整数 $k$,表示你的方案中的轮数($1\leq k\leq T$)。

接下来 $k$ 行,第 $i$ 行输出表示第 $i$ 轮的方案。

先输出一个整数 $type\in\{0,1,2\}$表示第 $i$ 轮的行动类型:

  • 若 $type=0$,表示第 $i$ 轮你($1$ 号玩家)什么也不干。

  • 若 $type=1$,接下来输出两个正整数 $x_i,y_i$,表示第 $i$ 轮你($1$ 号玩家)使 $x_i$ 号玩家的能量增加了 $y_i$。这里要求 $2\leq x_i\leq n$ 且 $x_i$ 号玩家仍存活且 $1\leq y_i\leq a$,其中 $a$ 是 $1$ 号玩家当前的等级。

  • 若 $type=2$,接下来输出两个正整数 $x_i,y_i$,表示第 $i$ 轮你($1$ 号玩家)对 $x_i$ 号玩家造成了 $y_i$ 点伤害。这里要求 $2\leq x_i\leq n$ 且 $x_i$ 号玩家仍存活且 $1\leq y_i\leq a+p$,其中 $a$ 是 $1$ 号玩家当前的等级,$p$ 是 $1$ 号玩家当前的能量。

评分方式

对于每组数据,若你输出的方案不合法或没有使你获胜,你在该测试点不得分。

若输出的方案合法且使你获胜,则若你承受的伤害不超过 $maxS$,你可以得到该测试点 $100\%$ 的分数,否则只能得到该测试点 $20\%$ 的分数。

校验器

为了方便选手测试,附加文件中我们给出了名为 checker.cpp 的文件,选手可以编译该程序,并使用它校验自己的输出文件。但请注意它与最终评测时所使用的校验器并不完全一致。你也不需要关心其代码的具体内容。

编译命令为:g++ -std=c++11 checker.cpp −o checker。此外,附加文件中有还有名为 testlib.h 的文件,在编译时,请确保该文件与 checker.cpp 在同一子目录下。

在终端中,checker 的使用方式为:checker <输入文件名> <输出文件名> <输出文件名>。如果你的输入文件名为 D.in,输出文件名为 D.out,则正确的使用方式为 checker D.in D.out D.out

若你的方案合法且使你获胜,校验器会给出 ok 并输出你承受的伤害,否则,该校验器会给出简要的错误信息。

数据范围

对于所有数据,$2\leq n\leq 100,1\leq a_i,b_i\leq 10^9,0\leq M,maxS,A_i,B_i,P_i,Q_i \leq 10^{18},\sum\limits_{i=1}^{n} a_i\leq 10^9$。

下载

输入数据与样例评测库下载