2022年CSP-S2复赛试题
__SECTIONS__:[{"name": "编程题", "count": 4}] 从PDF导入:2022年CSP-S2复赛试题
试卷题目预览
假期计划(holiday)
小熊的地图上有 n 个点,其中编号为 1 的是它的家、编号为 2, 3, ..., n 的都是景点。部分点对之间有双向直达的公交线路。
如果点 x 与 z1、z1 与 z2、...、zk-1 与 zk、zk 与 y 之间均有直达的线路,那么我们称 x 与 y 之间的行程可转车 k 次通达;特别地,如果点 x 与 y 之间有直达的线路,则称可转车 0 次通达。
很快就要放假了,小熊计划从家出发去 4 个不同的景点游玩,完成 5 段行程后回家:家 → 景点 A → 景点 B → 景点 C → 景点 D → 家,且每段行程最多转车 k 次。
假设每个景点都有一个分数,请帮小熊规划一个行程,使得小熊访问的四个不同景点的分数之和最大。
从文件 holiday.in 中读入数据。 第一行包含三个正整数 n, m, k,分别表示地图上点的个数、双向直达的点对数量、每段行程最多的转车次数。 第二行包含 n-1 个正整数,分别表示编号为 2, 3, ..., n 的景点的分数。 接下来 m 行,每行包含两个正整数 x, y,表示点 x 和 y 之间有道路直接相连。
输出到文件 holiday.out 中。 输出一个正整数,表示小熊经过的 4 个不同景点的分数之和的最大值。
8 8 1 9 7 1 8 2 3 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 1
27
策略游戏(game)
小 L 和小 Q 在玩一个策略游戏。
有一个长度为 n 的数组 A 和一个长度为 m 的数组 B,在此基础上定义一个大小为 n×m 的矩阵 C,满足 Ci,j = Ai × Bj。
游戏一共会进行 q 轮,在每一轮游戏中,会事先给出 4 个参数 l1, r1, l2, r2。
游戏中,小 L 先选择一个 l1~r1 之间的下标 x,然后小 Q 选择一个 l2~r2 之间的下标 y。
定义这一轮游戏中二人的得分是 Cx,y。
小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。
请问:按照二人的最优策略,每轮游戏的得分分别是多少?
从文件 game.in 中读入数据。 第一行输入三个正整数 n, m, q。 第二行 n 个整数,表示数组 A 的元素。 第三行 m 个整数,表示数组 B 的元素。 接下来 q 行,每行四个正整数 l1, r1, l2, r2。
输出到文件 game.out 中。 输出共 q 行,每行一个整数,表示每一轮游戏的得分。
3 2 2 0 1 -2 -3 4 1 3 1 2 2 3 2 2
0 4
星战(galaxy)
在这一轮的星际战争中,我方在宇宙中建立了 n 个据点,以 m 个单向虫洞连接。我们把终点为据点 u 的所有虫洞归为据点 u 的虫洞。
战火纷飞之中这些虫洞很难长久存在,敌人的打击随时可能到来。这些打击中的有效打击可以分为两类:
1. 敌人会摧毁某个虫洞,这会使它连接的两个据点无法再通过这个虫洞直接到达。
2. 敌人会摧毁某个据点,这会导致该据点的所有还未被摧毁的虫洞被一同摧毁。
我方发展出了两种特种部队负责修复虫洞:
A 型特种部队可以将某个特定的虫洞修复。
B 型特种部队可以将某据点的所有损坏的虫洞修复。
为了把握发动反攻的最佳时机,指挥部必须关注战场上的所有变化。
总指挥认为:如果从我方的任何据点出发,可以进行无限次的虫洞穿梭,且只有一个从该据点出发的虫洞可用,那么这个时刻就是一个绝佳的反攻时刻。
从文件 galaxy.in 中读入数据。 输入的第一行包含两个正整数 n, m。 接下来 m 行每行两个数 u, v,表示一个从据点 u 出发到据点 v 的虫洞。 接下来一行一个正整数 q 表示询问个数。 接下来 q 行每行表示一次询问或操作。
输出到文件 galaxy.out 中。 输出一共 q 行。对于每个指令,输出这个指令执行后能否进行反攻。
3 6 2 3 2 1 1 2 1 3 3 1 3 2 11 1 3 2 1 2 3 1 1 3 1 1 2 3 1 3 3 3 2 2 3 1 3 1 3 1 3 4 2 1 3 2
NO NO YES NO YES NO NO NO YES NO NO
数据传输(transmit)
小 C 正在设计计算机网络中的路由系统。
测试用的网络总共有 n 台主机,依次编号为 1~n。这 n 台主机之间由 n-1 根网线连接,第 i 条网线连接主机 ai 和 bi。保证任意两台主机可以通过有限根网线直接或者间接地相连。
受制于信息发送的功率,主机 a 能够直接将信息传输给主机 b 当且仅当两个主机在可以通过不超过 k 根网线直接或者间接的相连。
在计算机网络中,数据的传输往往需要通过若干次转发。每台主机处理信息都需要一定的时间,第 i 台主机处理信息需要 vi 单位的时间。
现在总共有 q 次数据发送请求,第 i 次请求会从主机 si 发送数据到主机 ti。小 C 想要知道,对于每一次请求至少需要花费多少单位时间才能完成传输。
从文件 transmit.in 中读入数据。 输入的第一行包含三个正整数 n, Q, k,分别表示网络主机个数、请求个数、传输参数。 输入的第二行包含 n 个正整数 vi。 接下来 n-1 行,每行包含两个正整数 ai, bi。 接下来 Q 行,每行包含两个正整数 si, ti。
输出到文件 transmit.out 中。 输出 Q 行,每行一个正整数,表示每次请求至少需要花费的单位时间。
7 3 3 1 2 3 4 5 6 7 1 2 1 3 2 4 2 5 3 6 3 7 4 7 5 6 1 2
12 12 3