数据结构/PTA-列车调度/栈/数组

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

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

 

分析:出这道题的人的语文成绩估计一塌糊涂……

           可以这么理解题意:原本,只有一条连接出入口的轨道。现在,由于好几辆车都不是顺序驶入,却还要求他们降序驶出,所以需要另开出其他轨道供它们                   走,使得它们能降序驶出。(但原有轨道应算在结果里)

          想让列车按降序输出,那么必须让同一条轨道上的车编号大的先进入,编号小的后进入,而如果一条轨道上编号最小的车的编号如果比要处理的

          车的编号还要小的话,那么这个该处理的车就必须新开一条轨道去让该车进入。

           样例中输出的结果应该是   8   4   2   1——————

                                                      5   3——————————

                                                      9   6——————————

                                                      7————————————

         1、考虑使用二分法

         2、使用set容器

            先将一个数插入进set容器中,set容器默认从小到大(自动排序);

           依次进行每个数的输入,如果输入的数比当前set容器中的最后一个数小,删除set容器中第一个大于输入数的值,再将输入数进行插入,

           重新排序后,输入的值就代替了删除的值,依次循环往复,进行到结尾 。


 

代码

二分法做法:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    scanf("%d",&n);

    int a[100005]= {0};    //最大到十万
    int i,sum=0;
    int x;
    for(i=0;i<n;i++)
    {
        scanf("%d",&x);
        if(sum==0||a[sum-1]<x)   //该车比前车大,直接另开新路
        {                        
            a[sum]=x;
            sum++;
        }
        else                    //该车比前车小,考虑是跟着前车的路,还是跟着其它比它大的车的路
        {                       //二分查找,找大于该车的最小编码车
            int p=0;
            int q=sum-1;
            while(p<q)         //直接照搬二分法步骤即可
            {
                int mid=(p+q)/2;
                if(a[mid]==x)
                    break;
                else if(a[mid]>x)
                       q=mid-1;
                else
                       p=mid+1;
            }
            a[p]=x;
        }
    }
     printf("%d",sum);
}

 set做法:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    int a[100001]={0};
    set<int>s;
    
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        if(s.upper_bound(a[i])!=s.end()){
            s.erase(s.upper_bound(a[i]));
            s.insert(a[i]);
        }
        else s.insert(a[i]);
    }
    cout<<s.size();
}

 https://blog.csdn.net/qq_40160605/article/details/80150252

https://blog.csdn.net/suguoliang/article/details/88592304

原文地址:https://www.cnblogs.com/elegantcloud/p/13749809.html