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;
}
全部评论

相关推荐

如题,只有过一段小厂实习经历,秋招会很吃亏吗?
陈100:你觉得你进入小厂实习后,实习前和实习后技术水平有提升没? 有的话,肯定有帮助
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务