L2-014列车调度
思路:
1:由于要求按序号递减的顺序离开,所以列车在车道中就需要按序号递减排列,每个车道的最后一辆是该车道序号最小的。
2:第一辆车首先开创一个车道。
3:车道可能会比较多,为节省空间可以只记录每个车道的最后一个车,即编号最小的车。
4:为了节省出可能会被浪费的空间(如果一个车道相邻两车之间序号相差较大,可能会存在两序号间的空间被浪费而需要额外开出车道的情况),保证车道数最少,需要让列车进入到最后一个车的序号与该车序号相差最小(即第一个大于,upper_bound())的那个车道,当然,如果都比它小,那就需要重新开一个车道。为了方便处理每车道的最后一辆车的序号的数据,使用set,不必多次排序。
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n,k;
scanf("%d",&n);
//定义一个set容器s
set<int>s;
for(int i=0;i<n;i++)
{
//逐个记录进站列车编号
scanf("%d",&k);
//第一个列车首先占用一个车道
if(i==0)
{
s.insert(k);
continue;
}
//从第二辆车开始,如果有某车道的最后一辆车的序号大于他,那就找到第一个大于他的序号并删除。
if( k < *( s.rbegin() ) )
s.erase( *( s.upper_bound(k) ) );
/*将这个序号加入容器。如果上一步的if语句执行了,那此时加入的k也就会进入到刚才被删除的序号
的位置,即进入那个车道。如果没执行(没有比他大的)那么容器长度就会+1,即新开了一个车道。*/
s.insert(k);
}
printf("%d",s.size());
return 0;
}