列车调度(贪心)

列车调度(贪心)#题目:火车站的列车调度铁轨的结构如下图所示。两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入(一条轨道可以停放多个火车)。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?输入格式…

大家好,又见面了,我是你们的朋友全栈君。

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

列车调度(贪心)

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入(一条轨道可以停放多个火车)。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

输入格式:

输入第一行给出一个整数N (2  N ≤10000),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

输出格式:

在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

输入样例:

98 4 2 5 3 9 1 6 7

输出样例:

4

#最初做的时候认为一条轨道只能停留一辆火车,还以为答案错了—_—

#此题对于使用贪心的理解:

我们需要尽量减少加轨道条数,也就是新的火车最好能到一条路线的末尾排着,而为了之后的顺序输出,一条轨道上后面的车需要比前面的编号小,这就产生了选择问题。选择时可以归结出以下逻辑:

选择时要减少轨道条数,增加轨道条数的条件是需要进入的火车大于所有链尾序号,所以为了减小这个条件的成立可能性,就需要使每条轨道尽量多地容纳。举个例子,比如我们现在有两条轨道,轨道上的链尾为轨道一:5号,轨道二:8号,我们需要插入4号车,如果将4号插入轨道二,轨道二上4到8之间的插入可能性就被夺取了,同等条件下,将4号插入5号,相当于没有夺取其他任何可插入的可能性。而我们的目的就是增大可以不加轨道条数的可能性(等价于增大链尾能插入的可能性,又等价于增大链尾能插入的数量),所以需要做的是将新的元素插入到与这个元素序号差别最小的链尾。

#使用贪心策略将火车排入轨道后一定能顺序排出,故不需要考虑排出。

#处于效率考虑,需进行一些逻辑的处理。比如,整个过程是没有必要遍历的,我们从第一个轨道开始,其实相当于划分了轨道上序号的范围,由于序号没有重复的,第二个轨道的序号永远会比第一个轨道大。运用这个规律,只要判定最后一条轨道的链尾序号与需插入的相比,就可以确定是否需要建立新轨道。如果不需要建立新轨道,插入的轨道就是从第一条开始遇到的第一个可以插入的轨道。

#代码实现1(二分):

#include<stdio.h>
const int maxn=1e5+5;


int main(){
    int n;
    int a[maxn];
    scanf("%d",&n);
    int k, len=0;
    while(n--){
        scanf("%d",&k);
        if(len==0||a[len-1]<k){
            a[len++]=k;
        }else{
            int l=0, r=len-1;
            while(l<r){
                int mid=l+(r-l)/2;
                if(a[mid]>k)
                    r=mid-1;
                else l=mid+1;
            }
            a[l]=k;
        }
    }
    printf("%d",len);
    return 0;
}

#代码实现2:

#include<stdio.h>
#include<limits.h>
#include<string.h>
int n;
int che[100001];          //che[]用于储存链尾序号
int N;
int count =1;

int foun(int n)
{

    if(n>che[count])
        return 0;
    if(n<che[count]&&n>che[count-1])
        return count;

    for(y=1;y<=count;y++)
       if(n<che[y])    //检查能否插入
             return y;

}
int main()
{
    scanf("%d",&N);
    int i,k,a;
    memset(che,0,sizeof(che));

    che[1]=INT_MAX;
    for(i=1;i<=N;i++)
    {
        scanf("%d",&n);
        if(a=foun(n))
            che[a]=n;   //更新链尾序号
        else                 //不可插入链尾,则创建新轨道
        {
            count++;
            che[count]=n;
        }
    }
     printf("%d",count);

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159411.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Python安装whl文件之坑「建议收藏」

    Python安装whl文件之坑「建议收藏」有的时候,使用pipinstallxxx会失败,这个时候我们就需要下载xxx.whl文件,而xxx.whl在版本上有很多不兼容的地方需要注意 1.whl文件兼容性很差,同一文件分版本具体下载哪一个版本?可在pythonIDE中输入importpip;print(pip.pep425tags.get_supported())(pip10没有pep425tags()…

  • js 删除换行符

    js 删除换行符mymsg=mymsg.replace(/<\/?.+?>/g,””);//html2txt去掉html标记mymsg=mymsg.replace(/\n|\r/g,””);//去掉换行转载于:https://www.cnblogs.com/jerryLee/archive/2010/02/01/1661036.html…

  • MOS管如何检测好坏[通俗易懂]

    MOS管如何检测好坏[通俗易懂]系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接6.程序设计9.检测标准MOS管是金属—氧化物—半导体场效应晶体管,或称是金属—绝缘体—半导体。MOS管的source和drain是可以对调的,他们都是在P型backgate中形成的N型区。在多数情况下,这个两个区是一样的,即使两端对调也不会影响器件的性能。这样的器件被认为是对称的。双极型晶体管把输入端电流的微小变化放大后,在输出端输出一个大的电流变化。双极型晶体管的增益就定义为输出输入电流之比(beta)。另一种晶体管,叫

  • 数据挖掘算法与现实生活中的应用案例[通俗易懂]

    数据挖掘算法与现实生活中的应用案例[通俗易懂]如何分辨出垃圾邮件”、“如何判断一笔交易是否属于欺诈”、“如何判断红酒的品质和档次”、“扫描王是如何做到文字识别的”、“如何判断佚名的著作是否出自某位名家之手”、“如何判断一个细胞是否属于肿瘤细胞”等等,这些问题似乎都很专业,都不太好回答。但是,如果了解一点点数据挖掘的知识,你,或许会有柳暗花明的感觉。本文,主要想简单介绍下数据挖掘中的算法,以及它包含的类型。然后,通过现实中触手可及的、活生生的案例

  • 日本优秀网站欣赏[通俗易懂]

    日本优秀网站欣赏[通俗易懂]http://www.quickhoney.com/http://www.charamil.com/http://www.b2caoyama.com/http://www.beams.co.jp/http://www.diadem.ru/http://www.taisei-kodaitoshi.com/http://www.sonymusic.co.jp/http://…

    2022年10月28日
  • 期货软件开发与平台搭建注意事项是什么_手机期货程序化交易软件

    期货软件开发与平台搭建注意事项是什么_手机期货程序化交易软件期货软件开发和期货平台搭建需要注意很多内容,关系到后期运营的是否正常稳定。现在市面上的很多的期货交易系统软件平台,基本都支持支持PC、安卓APP端,微信端、且具备风控系统、杠杆系统、交易系统、在线出入金、后台管理系统、代理系统、股票数据行情等功能。但是行业鱼龙混杂,并不是每一家开发公司都是靠谱的。加wx:“Zhangyoukeji001”发送相关演示版与报价!  作为投资者,要想拥有一个可靠的期货交易系统,需要注意以下几点:前期对期货系统软件的功能规划——针对期货系统软件,要有具体的规划方案,需

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号