7-9 列车调度 (25 分)
火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
以下这是我超时的代码,为什么超时呢,因为我的n²的时间复杂度,
#include <bits/stdc++.h>
using namespace std;
int a[100001];//用数组代替队列,因为队列并不容易实现我想要的操作
int sta[1000001];//记录此时的状态
//然而我超时了,我的时间复杂度是n²
int main()
{
int n;
int num;
int Count=0;
cin >> n;
int len=n;
int t;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
while(len)//这里超时了,假如只剩最后一个元素,那么要从头到倒数第二个元素在搜索一遍找到num
{
for(int i=1;i<=n;i++)
{
if(sta[i]==0)
{
sta[i]=1;
num=a[i];
len--;
t=i;
break;
}
}
for(int i=t+1;i<=n;++i)
{
if(a[i]<num&&sta[i]==0)
{
len--;
sta[i]=1;
num=a[i];
}
}
Count++;
}
cout << Count;
}
这是改邪归正的代码:
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int Max=0;
int cnt=0;
int main()
{
int n;
cin >> n;
while(n--)
{
int m;
cin >> m;
if(m>Max)
{
a[cnt++]=Max=m;
}else
{
int i=0,j=cnt-1;
while(i!=j)
{
if(a[(i+j)/2]<m)
{
i=(i+j)/2+1;
}else
{
j=(i+j)/2;
}
}
a[i]=m;
if(i==cnt-1)
{
Max=m;
}
}
}
cout << cnt;
return 0;
}