火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N
条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N
(2 ≤ N
≤105),下一行给出从1到N
的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
lower_bound(first,last,val),upper_bound(first,last,val) 如果是数组使用,返回的是对应位置的指针,如果找不到,返回的是数组尾地址的下一个地址。
如果是vector,set用返回的是对应位置的迭代器,如果查找不到返回的是.end()。
且上面两个用的对象必须是已经排序好的,set自动排序,但是数组 和向量需要实现排序好。
st.erase(it) st.find(k) st.count(k) st.insert(k) st.upper_bound(k)
总结:
列车的任务调度,适用于用一个规律去解释,就是:每次输入一个数,在已有的任务调度个数中去找大于该数的最小值,找到,删除,让该数进入,找不到 则需要再加一条调度线,即每次都找大于k的最小的那个值a,如果能找到,就删除a,并人k进入该调度,找不到就新建一个调度,让k进入。而set的下面的代码实现刚好符合这种规则,且因不需要保存这个调度序列,只需要知道调度线的个数,所以,不需要保存数据。
#include<cstdio>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int main(){
int n,k;
set<int> st;
cin>>n;
while(n--){
cin>>k;
set<int>::iterator it=st.upper_bound(k);
if(it!=st.end())
st.erase(it);
st.insert(k);
}
cout<<st.size()<<endl;
}