L2-014 列车调度 (25分)

必须要⻋号⼤的先出,⼩的后出。所以列⻋排队的每⼀队必须是从⼤到⼩排列(从右往左
看),才能保证开出去的⻋也是从⼤到⼩的。

对于每⼀个想要进⼊并列铁轨的⻋,如果⻋号⼤于每⼀ 队的队尾的⻋号,说明不能进⼊已经有的队伍,必须进⼊新的铁轨,否则,选择⼀个最接近它⻋号的 尾部⻋号的队伍进⼊。

其实⽆需保存每⼀个并⾏队列的所有值,只需要保存当前队伍的⻋尾(就是每 ⼀列最左边 即 每⼀列的最⼩值)即可,因为每⼀次都是需要排序⽐较⼤⼩的,所以⽤ set ⾃动排序, ⾸先把 set ⾥⾯放⼊⼀个 0 值。

每⼀次 set 的最后⼀个值 s.rbegin() 都是当前所有队列队尾的最⼤值。如 果当前想要进⼊排队队伍的 t 值⽐集合⾥⾯最⼤值⼩,就移除第⼀个⽐他⼤的值,然后把 t 插⼊集合 中。
表示的是将 t 值插⼊了最接近它⻋号的队伍的队尾,否则就直接插⼊进去 t 值。作为新的队伍。

s.upper_bound(t) 返回的是第⼀个⼤于 t 的迭代器的位置,在前⾯加星号表示取这个位置的值,所以 s.erase(*(s.upper_bound(t))); 表示删除当前这个刚好⼤于 t 的位置处的值。

因为⼀开始插⼊了⼀个没有的 0 ,所以最后输出是 s.size()-1;

#include<bits/stdc++.h>
#include<set>
#include<vector>
using namespace std;

int main()
{
    int n;
    cin>>n;
    set<int>s;
    s.insert(0);
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        if(x<*s.rbegin())
        {
            s.insert(x);
            s.erase(s.upper_bound(x));
        }
        s.insert(x);
    }
    cout<<s.size()-1;
    return 0;
}

注意:
c.begin() 返回一个迭代器,它指向容器c的第一个元素

c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置

c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值