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
Accepted Code
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std
;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Position
;
typedef int ElementType
;
struct QNode
{
ElementType
*Data
;
Position Front
, Rear
;
int MaxSize
;
};
typedef struct QNode
*Queue
;
Queue
CreateQueue(int MaxSize
) {
Queue Q
= (Queue
) malloc(sizeof(struct QNode
));
Q
->Data
= (ElementType
*) malloc(MaxSize
* sizeof(ElementType
));
Q
->Front
= Q
->Rear
= -1;
Q
->MaxSize
= MaxSize
;
return Q
;
}
bool IsFull(Queue Q
) {
return ((Q
->Rear
+ 1) % Q
->MaxSize
== Q
->Front
);
}
bool AddQ(Queue Q
, ElementType X
) {
if (IsFull(Q
)) {
return false;
} else {
Q
->Rear
= (Q
->Rear
+ 1) % Q
->MaxSize
;
Q
->Data
[Q
->Rear
] = X
;
return true;
}
}
bool IsEmpty(Queue Q
) {
return (Q
->Front
== Q
->Rear
);
}
ElementType
DeleteQ(Queue Q
) {
if (IsEmpty(Q
)) {
return ERROR
;
} else {
Q
->Front
= (Q
->Front
+ 1) % Q
->MaxSize
;
return Q
->Data
[Q
->Front
];
}
}
bool IfLess(ElementType
, Queue
);
void BinarySearch(int* , int , int );
#define MaxNum 100005
int main() {
int n
;
scanf("%d", &n
);
Queue Q
= CreateQueue(MaxNum
);
for (int i
= 0; i
< n
; ++i
) {
int num
;
scanf("%d", &num
);
AddQ(Q
, num
);
}
int Track
[MaxNum
] = {0};
int T_num
= 0;
Track
[T_num
++] = DeleteQ(Q
);
while (!IsEmpty(Q
)) {
int tmp
= DeleteQ(Q
);
if (tmp
> Track
[T_num
- 1]) {
Track
[T_num
++] = tmp
;
} else if (tmp
< Track
[T_num
- 1]) {
BinarySearch(Track
, tmp
, T_num
);
}
}
printf("%d\n", T_num
);
return 0;
}
bool IfLess(ElementType num
, Queue Q
) {
for (int i
= 0; i
< (Q
->Rear
- Q
->Front
+ Q
->MaxSize
) % Q
->MaxSize
; i
++) {
if (num
> Q
->Data
[i
]) return false;
}
return true;
}
void BinarySearch(int *Track
, int tmp
, int T_num
) {
int _begin
= 0, _end
= T_num
, mid
;
while (_begin
< _end
) {
mid
= _begin
+ (_end
- _begin
) / 2;
if (Track
[mid
] > tmp
) _end
= mid
;
else if (Track
[mid
] < tmp
) _begin
= mid
+ 1;
}
Track
[_end
] = tmp
;
}
仅供参考