解题思路:
因为火车是逆序输出的,而且属于FIFO,所以一开始应该先去判断增加轨道的条件,而这个条件就是如果当前这个数字大于前一个数字,那么就开一个轨道(这保证了每一个轨道都是逆序输出的)
如果小于,则要从第一个轨道开始找,直到找到第一个大于该数的轨道,把该数放入这个轨道中
如果这个轨道是最上面的那个轨道,就把当前数认作前一个数字(下一次比较的时候就是比较这个值来判断是否要开辟轨道)
如果不是就只要把这个轨道的最小值设置一下就可以了,因为每次都是比较最小值,所以设置这个最小值会方便。我是使用数组来保存的,但是这个查找第一个大于该数的轨道时候会超时;测试点三运行超时会过不去
图因为传不过来就不传了,你点开这个网站的时候应该就已经看过图了吧
两端分别是一条入口(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
思路代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
queue<int> q;
for(int i = 0;i<n;i++)
{
int temp;
cin>>temp;
q.push(temp);
}
int pre=0;
int arr[100005];//存放最小值,开小会段错误,根据题目来定
int cur=0;
while(n!=0)
{
int tt = q.front();
q.pop();
n--;
if(tt>pre)
{
cur++;
arr[cur] = tt;
pre = tt;
}else{
for(int j = 1;j<=cur;j++)//应该是这里会超时
{
if(j==cur)//最上面轨道
{
pre = tt;
}
if(arr[j]>tt)
{
arr[j] = tt;
break;
}
}
}
}
cout<<cur<<endl;
}
优化AC代码
--用到SET结构(set结构放入元素的时候会自动排序)和二分查找函数减少运行时间,不知道set的可以去了解一下C++的STL
#include<bits/stdc++.h>
using namespace std;
set<int> sp;
int main()
{
int n;
cin>>n;
set<int>::iterator it = sp.begin();
for(int i = 0;i<n;i++)
{
int temp;
cin>>temp;
it = sp.lower_bound(temp);
if(it!=sp.end())
{
sp.erase(it);
sp.insert(temp);
}else{
sp.insert(temp);
}
}
cout<<sp.size()<<endl;
}