机场廊桥分配问题

题目描述

当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位。乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折。然而,因为廊桥的数量有限,所以这样的愿望不总是能实现。

机场分为国内区和国际区,国内航班飞机只能停靠在国内区,国际航班飞机只能停靠在国际区。一部分廊桥属于国内区,其余的廊桥属于国际区。

L 市新建了一座机场,一共有 n 个廊桥。该机场决定,廊桥的使用遵循'先到先得'的原则,即每架飞机抵达后,如果相应的区(国内/国际)还有空闲的廊桥,就停靠在廊桥,否则停靠在远机位(假设远机位的数量充足)。该机场只有一条跑道,因此不存在两架飞机同时抵达的情况。

现给定未来一段时间飞机的抵达、离开时刻,请你负责将 n 个廊桥分配给国内区和国际区,使停靠廊桥的飞机数量最多。

输入描述

从文件 airport.in 中读入数据。

输入的第一行包含 3 个正整数 n, m1, m2 分别表示廊桥的个数、国内航班飞机的数量、国际航班飞机的数量。

接下来 m1 行是国内航班的信息,第 i 行包含 2 个正整数 a1,i, b1,i,分别表示一架国内航班飞机的抵达、离开时刻。

接下来 m2 行是国际航班的信息,第 i 行包含 2 个正整数 a2,i, b2,i,分别表示一架国际航班飞机的抵达、离开时刻。

每行的多个整数由空格分隔。

输出描述

输出到文件 airport.out 中。

输出一个正整数,表示能够停靠廊桥的飞机数量的最大值。

样例1

输入复制

3 5 41 53 86 109 1413 182 114 157 1712 16

输出

7

样例2

输入复制

2 4 620 3040 5021 2241 421 192 183 45 67 89 10

输出

4

提示

【样例 1 解释】

在图中,我们用抵达、离开时刻的数对来代表一架飞机,如 (1, 5) 表示时刻 1 抵达、时刻 5 离开的飞机;用 √ 表示该飞机停靠在廊桥,用 × 表示该飞机停靠在远机位。

我们以表格中阴影部分的计算方式为例,说明该表的含义。在这一部分中,国际区 有 2 个廊桥,4 架国际航班飞机依如下次序抵达:

  1. 首先 (2, 11) 在时刻 2 抵达,停靠在廊桥2. 然后 (4, 15) 在时刻 4 抵达,停靠在另一个廊桥3. 接着 (7, 17) 在时刻 7 抵达,这时前 2 架飞机都还没离开、都还占用着廊桥,而国际区只有 2 个廊桥,所以只能停靠远机位4. 最后 (12, 16) 在时刻 12 抵达,这时 (2 11) 这架飞机已经离开,所以有 1 个空闲的廊桥,该飞机可以停廊桥

根据表格中的计算结果,当国内区分配 2 个廊桥、国际区分配 1 个廊桥时,停靠廊 桥的飞机数量最多,一共 7 架。

【样例 2 解释】

当国内区分配 2 个廊桥、国际区分配 0 个廊桥时,停靠廊桥的飞机数量最多,一共4 架,即所有的国内航班飞机都能停靠在廊桥。

需要注意的是,本题中廊桥的使用遵循'先到先得'的原则,如果国际区只有 1 个廊桥,那么将被飞机 (1, 19) 占用,而不会被 (3, 4)、(5, 6)、(7, 8)、(9, 10) 这4 架飞机先后使用。

【样例 3】

见选手目录下的 airport/airport3.in 与 airport/airport3.ans。

【数据范围】

对于 20% 的数据,1 ≤ n ≤ 100, 1 ≤ m1 + m2 ≤ 100。对于 40% 的数据,1 ≤ n ≤ 5000, 1 ≤ m1 + m2 ≤ 5000。对于 100% 的数据,1 ≤ n ≤ 100000, 1 ≤ m1 + m2 ≤ 100000。所有 a1,i, b1,i, a2,i, b2,i 为数值不超过 10^8 的互不相同的正整数。保证 ∀i ∈ [1, n], a1,i < b1,i, a2,i < b2,i。

解题思路

本题可以使用贪心算法来解决。具体思路如下:

  1. 将所有航班按照抵达时间排序。2. 从第一个航班开始,如果当前区(国内/国际)还有空闲的廊桥,则分配廊桥给该航班。否则,该航班停靠远机位。3. 当所有航班都处理完毕后,统计停靠廊桥的航班数量,即为答案。

代码实现c++#include #include #include using namespace std;

struct Flight { int arrival; int departure; bool domestic;};

bool compare(Flight f1, Flight f2) { return f1.arrival < f2.arrival;}

int main() { int n, m1, m2; cin >> n >> m1 >> m2;

vector<Flight> domesticFlights(m1);    vector<Flight> internationalFlights(m2);

for (int i = 0; i < m1; i++) {        cin >> domesticFlights[i].arrival >> domesticFlights[i].departure;        domesticFlights[i].domestic = true;    }

for (int i = 0; i < m2; i++) {        cin >> internationalFlights[i].arrival >> internationalFlights[i].departure;        internationalFlights[i].domestic = false;    }

sort(domesticFlights.begin(), domesticFlights.end(), compare);    sort(internationalFlights.begin(), internationalFlights.end(), compare);

int domesticIndex = 0, internationalIndex = 0;    int maxFlights = 0;

for (int i = 0; i < n; i++) {        if (domesticIndex < m1 && domesticFlights[domesticIndex].arrival <= internationalFlights[internationalIndex].arrival) {            maxFlights++;            domesticIndex++;        }        else if (internationalIndex < m2) {            maxFlights++;            internationalIndex++;        }        else {            break;        }    }

cout << maxFlights << endl;

return 0
机场廊桥分配问题 - 算法题解

原文地址: https://www.cveoy.top/t/topic/kNj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录