列车调度问题[通俗易懂]

列车调度问题[通俗易懂]题目 高铁货运站的调配问题 我们国家大力发展道路交通基础设施 最近这些年修建了大量的高铁线路 以促进国内的物资运输和调配 ZZ 是一个超级货运站 是连接亚欧货运的枢纽站 现在 ZZ 货运站列车调度铁轨的结构如下图所示 两端分别是一条入口 Entrance 轨道和一条出口 Exit 轨道 它们之间有 N 条平行的轨道 每趟列车从入口可以选择任意一条轨道进入 最后从出口离开 在图中有 9 趟列车

题目:高铁货运站的调配问题

我们国家大力发展道路交通基础设施,最近这些年修建了大量的高铁线路,以促进国内的物资运输和调配,ZZ是一个超级货运站,是连接亚欧货运的枢纽站,现在ZZ货运站列车调度铁轨的结构如下图所示。

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

【输入格式】:

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

【输出格式】:

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

【输入样例】:

9
8 4 2 5 3 9 1 6 7

【输出样例】:

4

(1)题目分析: 此题为 ‘’求最少下降序列个数‘’的问题

要让列车降序输出,每一条轨道上必须编号大的先进入,编号小的后进入,所以每一条轨道上的列车是下降序列。如果待处理的列车编号比一条轨道上的最小编号要大,那么就要新开一条轨道让该车进入。

如果输入的列车编号是一个上升序列,那么需要的轨道条数就等于上升序列的个数。

样例中:

各条轨道应为:

————————————8 4 2 1

————————————5 3

————————————9 6

————————————7

(2)解题方法思路:

a[i]: 存储第i条 下降序列 末尾的最小值

二分法:快速查找与待处理元素最相近的 下降序列 末尾元素,并更新元素

(3)代码:

#include
#include

int a[100001]; //存储每条轨道最后的数

int main(){
int n,m; //n为输入的数据个数,m做临时存储
int k=1; //k为轨道数,并初始化为1
scanf("%d\n",&n);
scanf("%d",&m);
a[1]=m;//初始化a[1]
for(int i = 1;i < n; i++){
scanf("%d",&m);
if(m>a[k]){//比a中最大数还大,就增加一条轨道
k++;
a[k] = m;
}

else{ //二分法查找到a中与m最相近的值,然后更新那条轨道上的末尾的数
int l = 1;
int r = k;

while(l<=r){
int mid = (l+r)/2;
if(m>=a[mid]){
l++;
}
else{
r--;
}
}
a[l] = m;
}

}

printf("%d",k); //打印轨道数k

}
编程小号
上一篇 2025-02-20 09:30
下一篇 2025-03-17 23:51

相关推荐

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