L2-014 列车调度 (25 分)
火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(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
思路:
判断最长升序数字串是多少位,因为如果前一个数字比后一个数字大的话,是可以直接通过的,不用另外的轨道。
题目只给了300ms,使用贪心和动态规划都会可能出现超时现象,所以考虑使用二分法来更新数组,如果当前的数字大于数组最大的数字,就加入到数组中,不然就利用二分法更新数组中的数字。
zimport java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
int n = (int)sc.nval;
int[] arr = new int[n+1];
int len = 0;
for(int i=0; i<n ; i++) {
sc.nextToken();
int num = (int)sc.nval;
if(len==0 || arr[len-1]<num) {
arr[len++] = num;
} else {
int l = 0;
int r = len-1;
int mid = 0;
while(r-l>0) {
mid = (l+r)/2;
if(arr[mid] < num) {
l = mid+1;
} else {
r = mid;
}
}
arr[r] = num; //这里要确保替换的是右边的数字,不可以替换左边,不然会出错
}
}
System.out.print(len);
}
}