L2-014. 列车调度
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
火车站的列车调度铁轨的结构如下图所示。

Figure
两端分别是一条入口(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
题意 就是 小的数字跟在大数后面 看有几组 跟杭电的最少拦截系统一样
一写就超时了 没看数据10万的(做题时间复杂度还是写代码前最需要考虑的)
超时的代码
#include<bits/stdc++.h>
using namespace std;
int aa[100010];
bool vis[100010];
int main()
{ int n,i,xf,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0; i<n; i++)
scanf("%d",&aa[i]);
memset(vis,0,sizeof(vis));
int sum=0;
for(i=0; i<n; i++)
{
if(vis[i]) continue;
xf=aa[i];
vis[i]=1;
for(j=i+1; j<n; j++)
{
if(aa[j]<xf&&!vis[j])
{
xf=aa[j];
vis[j]=1;
}
}
sum++;
}
printf("%d\n",sum);
}
return 0;
}
10万的吗 不是O(N)就是O(N*LOGN)的 还有其他的吗?
#include<bits/stdc++.h>
using namespace std;
set<int>ss;
int aa[100010];
int main()
{
int n,i,xf,j;
set<int>::iterator it;
while(scanf("%d",&n)!=EOF)
{
for(i=0; i<n; i++)
scanf("%d",&aa[i]);
ss.clear();
ss.insert(100010);
int sum=0;
for(i=0; i<n; i++)
{
it=ss.upper_bound(aa[i]);
if(it==ss.end())
{
ss.insert(aa[i]);
}
else
{
ss.erase(it);//删除的时候迭代器it会被删除
ss.insert(aa[i]);
}
}
printf("%d\n",ss.size());
}
return 0;
}
再次感觉到容器是个好东西