#19287. 穿越海峡
穿越海峡
你好!我是你的OI金牌教练。
在前面的课程中,我们已经涉及了秦、汉、隋唐、宋、明(长城)等历史时期。今天,我们继续停留在明朝,把目光投向波澜壮阔的大航海时代,结合**“郑和下西洋”**的历史背景,讲解一类非常经典的算法问题——区间合并 (Interval Merging)。
这道题目符合 GESP 6级 难度,重点考察结构体排序和贪心思维。
第一部分:背景知识讲解
1. 郑和下西洋 (Zheng He's Voyages)
明成祖永乐年间(1405年-1433年),为了宣扬国威、加强与海外各国的联系,三宝太监郑和率领庞大的船队七次下西洋。
- 规模:郑和船队规模空前,拥有巨大的“宝船”,随行人员多达两万余人。
- 航线:从苏州刘家港出发,经东南亚、印度洋,最远到达红海沿岸和非洲东海岸。
2. 海峡通行与船队调度
在航行过程中,船队经常需要穿越狭窄的海峡(如马六甲海峡)。海峡的水文条件复杂,可能只有特定的时间段或特定的航道适合通行。 为了保证安全,船队中的各分队需要规划好通过海峡的时间。如果两支分队的计划通行时间有重叠,它们就必须合并成一个更大的编队依次通过(或者视为一段连续的繁忙时间),以避免调度混乱。
3. 算法模型:区间合并
我们将时间看作数轴。每支分队的通行计划是一个区间 。
- 如果有两个区间 和 ,它们有重叠部分,实际上这段时间海峡一直是繁忙的,繁忙时间段合并为 。
- 如果有两个区间 和 ,它们虽然不重叠,但在时刻 5-6 之间可能有空隙(视题目定义,如果是离散时刻通常不合并,如果是连续时间轴且端点重合则合并)。
- 我们的目标是将杂乱的、可能有重叠的时间段,整理成若干个互不重叠的“连续通行时段”。
第二部分:题目内容
题目名称:穿越海峡 (Crossing the Strait)
题目描述
郑和的船队即将通过一处险要的海峡。船队共有 支分队,编号为 到 。 根据水文观测,第 支分队计划在时刻 开始进入海峡,并在时刻 驶离海峡(包含端点 和 )。
为了确保指挥统一,郑和命令:如果两支分队的计划通行时间有重叠(哪怕只是端点重合,例如一支在时刻 5 结束,另一支在时刻 5 开始),它们就必须归入同一个“护航编队”进行统一调度。这个合并过程具有传递性(即 A 和 B 重叠,B 和 C 重叠,则 A、B、C 都在同一个编队)。
经过这样的合并整理后,所有分队会被划分成若干个独立的“护航编队”,每个编队占用一段连续的通行时间。
请你编写程序计算:
- 最终形成了多少个独立的护航编队(即合并后的区间个数)?
- 在这些编队中,持续时长最长的一个编队占用了多长时间?(时长定义为 )。
输入格式
第一行包含一个正整数 ,表示分队的数量。
接下来 行,每行包含两个正整数 ,表示第 支分队的计划通行开始时刻和结束时刻。
输出格式
输出一行,包含两个整数,中间用空格隔开。 第一个整数表示独立的护航编队数量。 第二个整数表示最长的通行时长。
输入输出样例 #1
输入:
4
1 3
2 6
8 10
15 18
输出:
3 5
样例 #1 解释:
- 分队1:
- 分队2: 。与分队1重叠(2 < 3),合并为 。
- 分队3: 。与 不重叠。这是一个新的编队。
- 分队4: 。与 不重叠。这是一个新的编队。
- 最终有 3 个编队:。
- 时长分别是:, , 。
- 最长时长为 5。
输入输出样例 #2
输入:
5
2 4
4 8
10 12
1 3
15 20
输出:
3 7
样例 #2 解释:
区间分别是:[2,4], [4,8], [10,12], [1,3], [15,20]。
注意:输入是乱序的!必须先排序!
排序后:
[1, 3][2, 4]-> 与上一个重叠,合并为[1, 4][4, 8]-> 与上一个重叠(端点4重合),合并为[1, 8][10, 12]-> 不重叠,新编队。[15, 20]-> 不重叠,新编队。
结果:
- 编队1:
[1, 8],时长 。 - 编队2:
[10, 12],时长 。 - 编队3:
[15, 20],时长 。 - 数量:3,最长时长:7。
数据范围
对于 的数据:
- 时间限制:1.0 秒