L2-014 列车调度
L2-014 列车调度 - 团体程序设计天梯赛-练习集 (pintia.cn)
题解
这道题要先分析清楚题目意思,以题目中的样例来分析调度列车的过程:
-
第一趟列车是
8
,此时没有已占用的平行轨道,所以为它新开一条轨道(相当于新建一个栈),把8
放入这条轨道,此时轨道情况为:轨道 1:[8]
。 -
第二趟列车是
4
,它的序号4
小于8
,可以放入有8
的这条轨道(因为后续出栈时能满足递减顺序),将8
替换为4
,轨道情况变为:轨道 1:[4]
。 -
第三趟列车是
2
,2
小于4
,同样可以放入这条轨道,将4
替换为2
,轨道情况是:轨道 1:[2]
。 -
第四趟列车是
5
,此时5
大于2
,不能放入当前这条轨道(否则无法保证按递减顺序出栈),所以需要新开一条轨道,把5
放入新轨道,轨道情况变为:轨道 1:[2]
,轨道 2:[5]
。 -
第五趟列车是
3
,3
小于5
且大于2
,所以可以放入有5
的这条轨道,将5
替换为3
,轨道情况为:轨道 1:[2]
,轨道 2:[3]
。 -
第六趟列车是
9
,9
大于2
和3
,都不能放入现有的轨道,于是再新开一条轨道,把9
放入,轨道情况是:轨道 1:[2]
,轨道 2:[3]
,轨道 3:[9]
。 -
第七趟列车是
1
,1
小于2
,放入有2
的轨道,将2
替换为1
,轨道情况变为:轨道 1:[1]
,轨道 2:[3]
,轨道 3:[9]
。 -
第八趟列车是
6
,6
大于1
和3
小于9
,放入有9
的轨道,将9
替换为6
,轨道情况是:轨道 1:[1]
,轨道 2:[3]
,轨道 3:[6]
。 -
第九趟列车是
7
,7
大于1
、3
和6
,不能放入现有的轨道,再新开一条轨道,把7
放入,轨道情况为:轨道 1:[1]
,轨道 2:[3]
,轨道 3:[6]
,轨道 4:[7]
。
这道题分析清楚后很容易想到set集合,set集合的特性是不会出现重复的内容,并且会将存入的数据按顺序排列。在分析中,我们存入set集合中的颜色代表每一条轨道上列车编号最小的那个元素,存入set集合的个数就代表轨道的数量。
下面是代码中用到的set集合的一些方法。
end(); // 返回指向最后一个元素的后一个位置的迭代器
size(); // 返回集合中元素的数目
upper_bound(); // 返回大于某个值元素的迭代器
erase(); // 删除集合中的元素
insert(); // 在集合中插入元素
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
set<int> s;
int num;
for(int i=0;i<n;i++){
cin>>num;
auto a=s.upper_bound(num);
if(a!=s.end()){
s.erase(a);
}
s.insert(num);
}
cout<<s.size();
return 0;
}