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 }
  • 相关阅读:
    实用硬件篇(一)
    iOS通讯录(纯纯的干货)
    iOS社会化分享(干货)
    静态库的打包及使用(干货)
    iOS地图集成示例:百度地图POI检索
    iOS开发之KVC全解
    网络干货
    输入一个字符串,按字典序打印出该字符串中字符的所有排列(剑指offer)
    序列化二叉树
    二叉树中和为某一值的路径
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8485926.html
Copyright © 2011-2022 走看看