本题翻译自 2021년도 국제정보올림피아드 대표학생 선발고사 2차 선발고사 #1 총 쏘기。
请注意,你不需要也不应该实现 main 函数。具体实现方式见【实现细节】部分。
警告:滥用本题评测一次即可封号。
有一款由两名玩家共同参与的在线射击游戏。游戏的目标是在一个虚构的城市中摧毁建筑物。
游戏中, 座建筑物从左到右排列在水平地面上。建筑物从左到右依次编号为 到 。每座建筑物的高度用一个序列 ()表示,且 是 到 之间互不相同的整数。
两名玩家从所有建筑物左侧的同一位置出发。在时间 ()时,两名玩家同时发射一发子弹,子弹从发射位置水平向右飞行。两发子弹的速度相同。玩家可以选择子弹的发射高度 ,即从地面到子弹的垂直距离, 为 到 之间的整数。两名玩家可以选择相同的发射高度。
如果玩家选择的发射高度为 ,则子弹会摧毁满足 且未被摧毁的最左侧建筑物。如果没有满足条件的建筑物,则不会发生任何事。如果两名玩家的子弹同时满足条件且目标建筑物相同(由于子弹速度相同),则只有该建筑物会被摧毁。特别地,如果两名玩家的发射高度相同,则始终只有一个建筑物被摧毁。例如,若 ,,且两名玩家均选择 ,则只有建筑物 会被摧毁。
问题的目标是:给定 座建筑物的高度,找到摧毁所有建筑物的最短时间 ,以及每个时间点两名玩家的子弹发射高度。
实现细节
你需要实现以下函数:
vector< pair<int, int> > min_shooting_buildings(vector<int> A)
- 该函数仅被调用一次。
- 参数 是一个长度为 的数组, 表示建筑物 的高度 ()。
- 该函数返回一个长度为 的数组 ,其中 是摧毁所有建筑物的最短时间。数组 的每个元素 表示两名玩家的子弹发射高度。
在提交的源代码中,任何地方都不允许调用输入输出函数。