L2-014. 列車調度
時間限制
300 ms
內存限制
65536 kB
代碼長度限制
8000 B
火車站的列車調度鐵軌的結構如下圖所示。
兩端分別是一條入口(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
題目鏈接:https://www.patest.cn/contests/gplt/L2-014
題意
給一個序列,元素從左向右走進入緩衝區,計算要用多少個隊列才能讓它從小到大輸出。
題解
要想最後能從小到大輸出,那麼在入隊列的時候必須保證一個隊列內是從左往右遞減的順序。
維護一個q數組,每輸入一個數字就查找q數組中比它更大的第一個數字,也就是上界,如果找得到,那就用這個數字更新該位置q數組的值(加入該隊列);
找不到就直接放在當前q數組的末尾(新的隊列)。最終,q數組的長度就是要使用的隊列數。
注意:尋找上界的時候用二分查找進行優化,否則會超時。
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#define INF 0xffffffff
using namespace std;
const int maxn = 100000+5;
int a[maxn];
int q[maxn];
int main(){
int n;
while(scanf("%d", &n) == 1 && n){
memset(q, 0 ,sizeof(q));
int cnt = 0;
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
int temp = upper_bound(q, q+cnt, a[i])-q; //二分查找優化,尋找上界
if(temp == cnt){
q[cnt++] = a[i];
}
else{
q[temp] = a[i];
}
}
printf("%d\n", cnt);
}
return 0;
}