PAT-列车调度-7-7 列车调度

题目描述

https://pintia.cn/problem-sets/1255385273459568640/problems/1255385406330916871
车站的列车调度铁轨的结构如下图所示。

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

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

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

输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
PAT-列车调度-7-7 列车调度_第1张图片

思路解答

必须要大的先进入, 小的后进入. 所以在平行轨道中列车必须是从小到大排列的, 从左向右看, 才能保证开出去的车也是从大到小的.

对于一个列车来说, 他要进入的平行轨道里面的列车的编号不可以比他小, 否则必须进入一条新的轨道,或者选一条轨道里面的列车编号恰好比他大的轨道

不需要知道每一条轨道上面的列车的全部信息, 只需要知道列车轨道最左边的列车编号, 也就是编号最小的列车. 因为只要列车轨道上面的列车是从小到大排列的, 总是有办法使它们正确的离开平行轨道

必须先初始化一条的轨道来 insert(0); , 这样第一条列车才有比较的对象,

因为一开始插入了一个没有的 0 ,所以最后输出是 s.size()-1;

代码

#include 
#include 
using namespace std;
int main() {
    int n, t;
    cin >> n;
    set s;
    s.insert(0);
    for(int i = 0; i < n; i++) {
        cin >> t;
        if(t < *s.rbegin())//s.rbegin()是当前所有平行轨道的左边最大编号
        {
            //这条列车可以直接接到某一条已经有列车的平行轨道上
            s.erase(*(s.upper_bound(t)));//删除当前这个刚好大于t的位置处的值
        }
        s.insert(t); //添加到新轨道上
    }
    cout << s.size() - 1;
    return 0;
}

你可能感兴趣的:(算法与数据结构,PTA刷题)