【CCCC】L2-014 列车调度 (25分),贪心,set维护序列

    科技2022-07-12  138

    problem

    L2-014 列车调度 (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

    有n列车开入轨道,求最少多少条可以让其序号递减从出口离开

    solution

    总感觉好像写过,而且每次列车都会想到单调栈emmmm,本题似乎用不到样例,8421,53,9,6,7,要四条。很容易想到,将所给的序列划分成几个递减序列每次遇到一辆新的列车,最好是贪心的选择与自己最相近的队伍,没有大于自己的队伍的话就开一个队伍(因为要维护一个队伍末位列车的有序序列,而且每次要删除和查找)可以想到用set维护每一个队伍的最后一列车,然后每次二分查找,set大小即为答案 #include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; set<int>s; s.insert(100010);//最少一个队伍 for(int i = 1; i <= n; i++){ int t; cin>>t; if(t<*s.rbegin()){//如果找得到队伍 s.erase(*(s.upper_bound(t)));//找到比他大的第一个值删掉 } s.insert(t);//找到就加,找不到就开 } cout<<s.size()<<endl; return 0; }
    Processed: 0.014, SQL: 8