火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有
N
条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?输入格式:
输入第一行给出一个整数
N
(2 ≤N
≤105),下一行给出从1到N
的整数序号的一个重排列。数字间以空格分隔。输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9 8 4 2 5 3 9 1 6 7
输出样例:
4
分析:
题目要求算出车按序号递减的顺序调离所需要的最少的铁轨条数;
2、因为是递减顺序调离列车,所以同一条轨道上的列车顺序必须是递减的;
3、定义一个可变数组,顺序遍历列车编号;
(1)将第一列火车的编号放入数组首位;
(2)如果下一列火车的编号小于上列火车,则将将上一列火车所在的数组单元的值替换为编号小的火车;
(3)如果下一列火车的编号大于上列火车,则重新放入一个新的数组单元;
实现代码如下:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(void) { int N; cin >> N; int *train = new int[N]; for (int i = 0; i < N; i++) cin >> train[i]; vector<int> v; for (int i = 0; i < N; i++) { vector<int>::iterator it = lower_bound(v.begin(), v.end(), train[i]); if (it != v.end()) *it = train[i]; else v.push_back(train[i]); } cout << v.size(); }