题意
将乱序的火车最后以递减顺序排列
思路
- 1.如果是不能直接开出的回车需要排在轨道内
- 2.那轨道内的车应该按递增的顺序才能最后输出以递减顺序排列
- 3.要使得需要的轨道数最少排序就要将火车与火车间的差值最小,可以利用二分找到临界点
坑点
注意什么时候要加上新的轨道
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];//a存放原来火车的顺序,b记录轨道内最后一辆车的编号
int main()
{
int n;
cin>>n;
int cnt=0;//记录轨道数
for(int i=0;i<n;i++)
{
cin>>a[i];
if(cnt==0||b[cnt-1]<a[i])//如果轨道数为0或轨道内末尾最后的火车编号比需要加入的火车小,需要新加个轨道
{
b[cnt++]=a[i];
}
else{
int l=0,r=cnt-1;//利用二分在已有轨道中找到间距最小的轨道加入
while(l<r)
{
int mid=(l+r)/2;
if(b[mid]>a[i])
{
r=mid;
}
else{
l=mid+1;
}
}
b[l]=a[i];
}
}
cout<<cnt;
return 0;
}