个人介绍:
题目传送们:
P8856 [POI 2002] 火车线路 - 洛谷 (luogu.com.cn)
前言:
这道题主要是模拟火车车票订购的过程,根据给定的火车座位数、城市数量以及一系列的订票需求,按顺序判断每个订票需求是否能够被满足,可以使用线段树来解决次问题,以下是小亦为大家详细的解题思路:
#题目整体思路:
我们需要记录火车在每个站点的座位使用情况,然后对于每个订票需求,检查从起点战到目标的所有站点是否都有足够的空座位来满足该需求。如果都有足够的空座位,那么该订票需求可以被满足,同时更新这些站点的座位使用情况,否则的话,该订票不能被满足的。
##具体步骤:
1、输入处理:
1.1、读取三个整数 c , s , 和 r 。
1.2、初始化一个长度为 c 的数组,用 seuage 来记录每个站点的作为使用情况。其中,seauage[0] 存储火车的总座位数;其余元素初始化为 0 ,表示初始化时每个站点的作为使用次数为 0 。
2、处理每个订票需求:
2.1、循环 r 次,每次读取一个订票需求,包含起点站 o ,目标站 d 和需要的作为数 n 。
2.2、对于每个订票需求,执行下面的操作👇
检查是否可以满足需求:遍历从起点站 o 到目标站 d - 1 的所有起点,检查如果满足该订票需求后,每个站点的作为使用数是否会超过总位数,则该订票需求不能被满足,输出 n ,否则,该订票需求可以被满足,输出 t 。
更新座位使用的情况:如果订票需求可以被满足的话,更新从起点战 o 到目标站 d - 1 每个站点的作为使用数,将其增加 n 。
3、输出结果:
3.1、对于每个订票需求,根据是否可以满足需求输出 t 或 n 。
###复杂度:
1、时间复杂度:
。
2、空间复杂度:
。
####代码:
#include <bits/stdc++.h>
using namespace std;
const int MC = 60005;
int seuage[MC];
bool ceo(int start, int end, int num) {
for (int i = start; i < end; ++i) {
if (seuage[i] + num > seuage[0]) {
return false;
}
}
return true;
}
void usu(int start, int end, int num) {
for (int i = start; i < end; ++i) {
seuage[i] += num;
}
}
int main() {
int C, S, R;
cin >> C >> S >> R;
seuage[0] = S;
for (int i = 1; i <= C; ++i) {
seuage[i] = 0;
}
for (int i = 0; i < R; ++i) {
int O, D, N;
cin >> O >> D >> N;
if (ceo(O, D, N)) {
cout << "T" << endl;
usu(O, D, N);
} else {
cout << "N" << endl;
}
}
return 0;
}
感谢观看!!!