嗯。。
这道题是对我而言意义非凡的一道题
我第一次打CSP-S见到的第一道题,考场上20pts。从2021年10.24CSP当天开始 在洛谷交了很多遍。
之后看题解,有很多种这个题的做法,于是学习了一下。思想都大同小异,在实现上有着区别。、
简单来说,就是STL全家桶。
(PS:这几种做法是笔者在不同时间写的不同做法,时间跨度很大,代码风格很大,请见谅)
简易题面
分为两种停机坪,国内和国外,有 m 1 + m 2 m1 + m2 m1+m2个,给你 [ l , r ] [l,r] [l,r],为落地时间和起飞时间,不能降落的就等会再降落或者安排另外一个停机坪(如果有的话)。
给定 n , m 1 , m 2 n , m1 , m2 n,m1,m2和起飞落地时间,求最多能容纳多少飞机。
40pts 做法
我们考虑一下,
这个起飞时间其实是一个线性关系,也就是在一条时间线上,你总能找到某个飞机的起飞时间和落地时间,
不过有了 n n n个停机坪的限制,我们就要考虑一些其他的东西。
设最后的答案为 t o t tot tot,那么每当一个飞机落地的时候,那么 t o t + + tot++ tot++,飞机起飞的时候, t o t − − tot-- tot−−。
※如果 t o t tot tot在 + + ++ ++操作之后超过停机坪的限制数量,那么它就不能降落,同时进行标记,以防后面操作时进行 − 1 −1 −1 操作。
具体做法:
(1)读入航班信息按照抵达时刻从小到大进行排序并对时刻进行离散化。
(2)枚举每个廊桥,并在上述的※条件下下对每个离散化后的时刻进行处理,依次得到最大航班数量。
(3)进行统计。
它的复杂度? O ( n m 1 + n m 2 ) O(nm_1 + nm_2) O(nm1+nm2),因为题面给的 m 1 + m 2 < = 5000 m1+m2<=5000 m1+m2<=5000,那其实在极端数据下近似为 O ( n 2 ) O(n^2) O(n2)的。
#include<bits/stdc++.h>
using namespace std;