天梯赛 列车调度
Published on 2022-11-17 23:04 in 暂未分类 with 林动

天梯赛 列车调度

    列车调度
    火车站的列车调度铁轨的结构如下图所示。

    在这里插入图片描述

    两端分别是一条入口(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;
    } 
    
    posted @   林动  阅读(31)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
    · C#/.NET/.NET Core优秀项目和框架2025年2月简报
    · Manus爆火,是硬核还是营销?
    · 一文读懂知识蒸馏
    · 终于写完轮子一部分:tcp代理 了,记录一下
    点击右上角即可分享
    微信分享提示