社区讨论
一堆点RE求助。。。
P7913[CSP-S 2021] 廊桥分配参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo7p3mq1
- 此快照首次捕获于
- 2023/10/27 05:27 2 年前
- 此快照最后确认于
- 2023/10/27 05:27 2 年前
CPP
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#define maxn 100010
using namespace std;
/*
如果一架飞机过来了,在某个时间段内必然会有一个廊桥被使用
那如果我们开一个廊桥数组呢?
我们首先要知道
只有一条跑道指的是不存在同时抵达,同时离开,也不存在一个抵达一个离开的情况
这就好办多了
当有一架飞机降落的时候,我们检查这个时间的廊桥数量是否小于指定的廊桥数量
当然这里的廊桥数量需要枚举
当然实话实说,这种的只适合考场大暴力使用
*/
struct plane {
int arr; //arrive,到达
int lea; //leave,离开
};
bool cmp(plane a, plane b) {
return a.arr < b.arr;
}
plane npla[maxn]; //定义国内飞机数组
plane inpla[maxn]; //定义国外飞机数组
int nation[maxn]; //国内某时间使用的的廊桥数量
int innation[maxn]; //国外某时间使用的廊桥数量
int nn; //分配给国内的廊桥数
int in; //分配给国外的廊桥数
int n, m1, m2; //见题意
int ma = 0;
int main() {
cin >> n >> m1 >> m2;
for (int i = 1; i <= m1; i++) {
cin >> npla[i].arr >> npla[i].lea;
}
for (int i = 1; i <= m2; i++) {
cin >> inpla[i].arr >> inpla[i].lea;
}
sort(npla + 1, npla + m1 + 1, cmp);
sort(inpla + 1, inpla + m2 + 1, cmp);
for (int nn = 0, in = n - nn; nn <= n; nn++) { //开始枚举
int sum = 0;
for (int i = 1; i <= m1; i++) { //开始模拟每个飞机到站
if (nation[npla[i].arr] >= nn) { //如果当前廊桥已满(存在‘>’的情况)
continue;//开始下一个飞机
} else {
sum++; //这架飞机能够停靠廊桥
for (int j = npla[i].arr; j <= npla[i].lea; j++) {
nation[j]++; //这个时间段的廊桥使用数量加一
}
}
}
for (int i = 1; i <= m2; i++) { //国外的也是如此
if (innation[inpla[i].arr] >= in) { //如果当前廊桥已满(存在‘>’的情况)
continue;//开始下一个飞机
} else {
sum++; //这架飞机能够停靠廊桥
for (int j = inpla[i].arr; j <= inpla[i].lea; j++) {
innation[j]++; //这个时间段的廊桥使用数量加一
}
}
}
ma = max(sum, ma); //记录
memset(nation, 0, sizeof(nation));
memset(innation, 0, sizeof(innation));
}
cout << ma;
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...