列车调度(思维题,二分查找)

7-2 列车调度 (25 分)

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

两端分别是一条入口(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

输出样例:

4
#include<cstdio>  
#include<algorithm> 
#include<iostream>
using namespace std;
int a[100005];
int main()
{
	int n, i;
	int sum = 0;
	int *j;
	scanf("%d", &n);
	for (i = 0;i<n;i++)
	{
		int k;
		scanf("%d", &k);
		//由于每次小的会把离它最近的大的顶替,大的会放在最后,因此a数组一直有序,可用二分法查找第一个大于该车的位置
		j = lower_bound(a, a + sum, k);
		//只保留每个轨道的最后一个元素
		*j = k;
		//不比任意一个轨道的最后一个元素小,新开轨道
		if (j == a + sum)
			sum++;
	}
	printf("%d\n", sum);
	
}

每进来一个新车对每个轨道的最后一个列车进行二分查找,找到新车车号最近的那个比他大的车,顶替那辆车。否则新开一个轨道

猜你喜欢

转载自blog.csdn.net/weixin_42165786/article/details/88634525