火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(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
题意
如上
题解
这题就是求至少需要几个最长上升子序列O(nlogn)
铁路
首先8,加入1铁路,road[1]=8;
然后4比8小,加入1铁路,road[1]=4;
然后2比4小,同上,road[1]=2;
然后5比2大,这里现有road[1]=2,新加2铁路,road[2]=5;
然后3比5小,这里现有road[1]=2,road[2]=5,找1个比3大一点点的(贪心upper_bound>x的第一个),所有加入2铁路,road[2]=3;
然后9比3大,这里现有road[1]=2,road[2]=3(这里可以发现road数组是递增的),新加3铁路,road[3]=9;
以此类推
代码
注:代码这里为了方便数组下标从0开始
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,train,lb=0; 6 int road[100005]; 7 scanf("%d",&n); 8 while(n--) 9 { 10 scanf("%d",&train); 11 if(lb==0||train>road[lb-1]) 12 road[lb++]=train; 13 else 14 { 15 int f=upper_bound(road,road+lb,train)-road; 16 road[f]=train; 17 } 18 } 19 printf("%d ",lb); 20 return 0; 21 }