L2-014. 列车调度
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
火车站的列车调度铁轨的结构如下图所示。
Figure
两端分别是一条入口(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
解题思路:
题目意思很简单,给你一个序列,问你需要多少辅助通道才能组合出谜底序列。样例的队列为 1248 35 69 7.。根据数据比对可以发现,每次开创一个新的队列有两种情况,第一种情况就是没有队列和需要加入的值大于每个队列末尾的值。如开始输入8的时候没有队列,所以需要开创一个新的队列,输入4时,4比8小,加入8所在队列,2比4小加入4所在队列。5比42大开创一个新的队列,3比5小加入的队列,9比4,比2 大,开创一个新的队列,1比2,3,9,都小,但因为需要队列最少,所以加入一个末尾值跟它最接近的队列,6放入9队列,7开创新队列。这就是样例的情况分析。其他的一样,代码中有相应注释
#include<iostream>
#include<cmath>
using namespace std;
#define N 100000+10
int main(){
// freopen("input.txt","r",stdin);
int n,num;
scanf("%d",&n);
int len = 0;
int a[N];
for(int i = 0;i < n;i++){
scanf("%d",&num);
if(len == 0||a[len-1] < num){//如果原来没有点加入,或者要加入的点大于队伍中最后面的最大值
a[len++] = num; //需要开辟一个新的队伍
}else{
int l = 0,r = len-1;
while(l <= r){//找到比它大的最小值,并更新所在队伍最后面的值
int mind = (l+r)/2;
if(a[mind] > num){
r = mind - 1;
}else{
l = mind + 1;
}
}
a[l] = num;
}
}
printf("%d\n",len);
return 0;
}