【UOJ 575】列车调度
【题目描述】:
列车由东面进站只有一个车道,进站后站内共分有K个平行的车道,出站前汇聚为一个车道,由西面出站。
有N辆列车,标记为1,2,3,…,N。它们按照一定的次序进站,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为N,N-1,N-2,…,1,询问K的最小值是多少。
【输入描述】:
输入共2行。
第 1 行包含1个正整数N,表示N辆列车。
第 2 行包含N个正整数,为1至N的一个排列,表示进站次序。
【输出描述】:
输出共1行,包含1个整数,表示站台内轨道数K的最小值。
【样例输入1】:
3
1 2 3
【样例输出1】:
3
【样例输入2】:
9
1 3 2 4 8 6 9 5 7
【样例输出2】:
5
【时间限制、数据范围及描述】:
时间:1s 空间:128M
对于30%的数据,N≤10;
对于70%的数据,N≤2000;
对于100%的数据,N≤100000。
题解:最长不下降子序列!推一推就出来啦,像极了楼兰宝藏那道题目。
#include<bits/stdc++.h> #include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; const int N=100003; int a[N],n,s[N],k,vis[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ if(vis[i]==1) continue; bool flag=0; for(int j=1;j<=k;j++) if(a[i]<s[j]) { s[j]=a[i]; vis[i]=1; flag=1; break; } if(flag==0) s[++k]=a[i]; } cout<<k; return 0; }