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 <iostream>
#include <set>
using namespace std;
int main() {
     int n, t;
     cin >> n;
     set<int> s;
     s.insert(0);
     for(int i = 0; i < n; i++) {
         cin >> t;
         if(t < *s.rbegin()) {
             s.erase(*(s.upper_bound(t)));
         }
     s.insert(t);
     }
     cout << s.size() - 1;
     return 0;
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值