1. 程式人生 > >PTAL2-014 列車排程解題報告---二分 & 貪心

PTAL2-014 列車排程解題報告---二分 & 貪心

                                     L2-014 列車排程 (25 分)

火車站的列車排程鐵軌的結構如下圖所示。

兩端分別是一條入口(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

 鐵軌取值時需要二分找最合適的鐵軌

AC Code: 

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
constexpr auto INF = 0x3f3f3f3f;
using namespace std;
static const int MAX_N = 1e5 + 5;
int dp[MAX_N], cnt;
int binary_search(int v) {
	int left = 0, right = cnt;
	while (left <= right) {
		int mid = (left + right) >> 1;
		if (dp[mid] < v && dp[mid + 1] > v) return mid + 1;
		else if (dp[mid] < v) left = mid + 1;
		else  right = mid - 1;
	}
	return left;
}
int main(){
	//memset(dp, 0, sizeof(dp));
	int n;
	scanf("%d", &n);
	cnt = 0;
	for (int i = 0; i < n; i++) {
		int v;
		scanf("%d", &v);
		if (i == 0) dp[cnt++] = v;
		else {
			int next = binary_search(v);
			if (next >= cnt) dp[cnt++] = v;
			else dp[next] = v;
		}
	}
	printf("%d\n", cnt);
	return 0;
}