天梯赛 列车调度
列车调度
火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10
5
),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
#include<iostream>
using namespace std;
int main(){
int n;cin>>n;
int a[n];//a[i]存放的是这条道上的火车中最小的编号。
int max = 0;
int k;
while(n--){
cin>>k;
if(max == 0 || a[max-1] < k){//当道为零或者或者所有道的最小号都小于新来的号码,需要加一条道来放这个号码
a[max++] = k;
}
else{//有道能放下新来的,找到比新来的大且和间距最小的那个道,用新来的覆盖它的号码 ,二分查找
int l=0;int r=max-1;
while(l<r)
{
int mid=l+(r-l)/2;
if(a[mid]>k)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
a[l]=k;
}
}
cout<<max;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],cnt,n;
int find(int x)
{
if(cnt==0)return 0;
int l=0,r=cnt-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>x)r=mid;
else l=mid+1;
}
if(a[r]>x)return r;
return cnt;
}
int main()
{
cin>>n;
for(int i=0;i<n;++i)
{
int x;cin>>x;
int t=find(x);
if(t==cnt)a[cnt++]=x;
else a[t]=x;
}
cout<<cnt;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下