zoukankan      html  css  js  c++  java
  • PAT L2-014 列车调度(最长上升nlogn)

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

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

    题意

    如上

    题解

    这题就是求至少需要几个最长上升子序列O(nlogn)

    铁路

    首先8,加入1铁路,road[1]=8;

    然后4比8小,加入1铁路,road[1]=4;

    然后2比4小,同上,road[1]=2;

    然后5比2大,这里现有road[1]=2,新加2铁路,road[2]=5;

    然后3比5小,这里现有road[1]=2,road[2]=5,找1个比3大一点点的(贪心upper_bound>x的第一个),所有加入2铁路,road[2]=3;

    然后9比3大,这里现有road[1]=2,road[2]=3(这里可以发现road数组是递增的),新加3铁路,road[3]=9;

    以此类推

    代码

    :代码这里为了方便数组下标从0开始

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,train,lb=0;
     6     int road[100005];
     7     scanf("%d",&n);
     8     while(n--)
     9     {
    10         scanf("%d",&train);
    11         if(lb==0||train>road[lb-1])
    12             road[lb++]=train;
    13         else
    14         {
    15             int f=upper_bound(road,road+lb,train)-road;
    16             road[f]=train;
    17         }
    18     }
    19     printf("%d
    ",lb);
    20     return 0;
    21 }
  • 相关阅读:
    centos7物理机a start job is running for dev-mapper-centosx2dhome.device
    jenkins pipeline流水线
    nginx 加载慢 负载均衡不均衡
    山田预发环境发布脚本
    prometheus 监控容器
    maven私服安装使用
    日志清理
    ERROR 1046 (3D000) at line 1: No database selected
    网络工程学习经典书籍推荐
    每日一句
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8485926.html
Copyright © 2011-2022 走看看