列车调度
【 问题描述 】
有N辆列车,标记为1,2,3,…,N。它们按照一定的次序进站,站台共有K个轨道,轨道遵从 先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为N,N-1,N-2,…,1,询问K的最小值是多少。
例如下图中进站的顺序为1,3,2,4,8,6,9,5,7,则出站的顺序变为9,8,7,6,5,4,3,2,1。
【 输入格式 】
输入文件名为manage.in。
输入共2行。
第 1 行包含1个正整数N,表示N辆列车。
第 2 行包含N个正整数,为1至N的一个排列,表示进站次序。
【 输出格式 】
输出文件名为manage.out。
输出共1行,包含1个整数,表示站台内轨道数K的最小值。
【 输入输出样例1 】
manage.in manage.out
3
1 2 3
3
【 输入输出样例2 】
manage.in manage.out
9
1 3 2 4 8 6 9 5 7
5
【 数据规模与约定 】
对于30%的数据,N≤10;
对于70%的数据,N≤2000;
对于100%的数据,N≤100000。
/* 这是唯一一个做得出来的题,直接模拟,也可以说是贪心 题目要求每个车站的进入顺序编号大的一定有优先于编号小的,所以对于每次进入的车辆,枚举已有的车站,找一个能放下该车辆并且末尾车辆的编号最小的车站,放入该车辆。 */ #include<cstdio> #include<iostream> #define N 100010 using namespace std; int q[N],n,len; int main() { //freopen("jh.in","r",stdin); freopen("manage.in","r",stdin); freopen("manage.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { int x;scanf("%d",&x); bool flag=false; int minn=N,pos; for(int j=1;j<=len;j++) if(q[j]>x&&q[j]<minn) { flag=true; minn=q[j]; pos=j; } if(flag)q[pos]=x; else { ++len;q[len]=x; } } printf("%d",len); return 0; }