列车调度
火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10^5 ),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
代码
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
int arr[] = new int[n];// 每条轨道的最小列车序号
int ans = 1;// 轨道
arr[0] = Integer.parseInt(s[0]);// 初始化第一条轨道的列车序号
for (int i = 1; i < n; ++i) {
int num = Integer.parseInt(s[i]);// 即将驶入的列车序号
if (num > arr[ans - 1]) {
// 如果驶入的列车比每条轨道上末尾的列车序号都大,则增加一条轨道
arr[ans] = num;
ans++;
continue;
}
// 用二分查找搜索各条轨道中比驶入列车序号大的最小序号值,并将其替换为驶入列车的序号
int high = ans - 1, low = 0, mid = 0;
while (low <= high) {
mid = (high + low) / 2;
if (num < arr[mid]) {
// 驶入列车序号小于中间轨道列车序号
high = mid - 1;
} else {
// 驶入列车序号大于中间轨道列车序号
low = mid + 1;
}
}
arr[mid] = num;// 替换为驶入列车的序号
}
out.print(ans);
out.flush();
}
}