L2-014 列车调度(团体程序设计天梯赛-练习集)

link

  必须要车号⼤的先出,⼩的后出。所以列车排队的每⼀队必须是从⼤到⼩排列(从右往左看),才能保证开出去的车也是从⼤到⼩的。对于每⼀个想要进⼊并列铁轨的车,如果车号⼤于每⼀队的队尾的车号,说明不能进⼊已经有的队伍,必须进⼊新的铁轨,否则,选择⼀个最接近它车号的尾部车号的队伍进⼊。其实⽆需保存每⼀个并⾏队列的所有值,只需要保存当前队伍的车尾(就是每⼀列最左边
  即 每⼀列的最⼩值)即可,因为每⼀次都是需要排序⽐较⼤⼩的,所以⽤set⾃动排序,⾸先把set⾥⾯放⼊⼀个最大值。每⼀次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>

using namespace std;

set<int> s;
int main(){
    int n;
    cin >> n;
	s.insert(2e6);

    for(int i = 0; i < n; ++i){
        int x;
        cin >> x;
        if(x < *(s.rbegin()))
            s.erase(*(s.lower_bound(x)));
        s.insert(x);
    }

    cout << s.size() << endl;

	return 0;
}
posted @ 2025-03-06 15:56  awei040519  阅读(76)  评论(0)    收藏  举报