C++——NOIP模拟题——列车调度

列车调度

题目背景

161114-练习-DAY1-AHSDFZ T2

题目描述

有 N 辆列车,标记为 1,2,3,…,N。它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为 N,N-1,N-2,…,1,询问 K 的最小值是多少。

    

例如上图中进站的顺序为 1,3,2,4,8,6,9,5,7,则出站的顺序变为 9,8,7,6,5,4,3,2,1。

输入格式

输入共 2 行。
第 1 行包含 1 个正整数 N ,表示 N 辆列车。
第 2 行包含 N 个正整数,为 1 至 N 的一个排列,表示进站次序。

输出格式

输出共 1 行,包含 1 个整数,表示站台内轨道数 K 的最小值。

样例数据 1

输入


1 2 3

输出

3

样例数据 2

输入


1 3 2 4 8 6 9 5 7

输出

5

备注

【数据规模与约定】
对于 30% 的数据,N≤10;
对于 70% 的数据,N≤2000;
对于 100% 的数据,N≤100000。

30分做法: 
直接搜索每一辆列车进入哪一条轨道。剪枝1:若当前列车进入空轨道,选
择任意一个空轨道的结果是一样的。剪枝2:每一条轨道进入的列车的标号必须
单调下降。 
70分做法: 
  实际上就是求这个序列的最长上升子序列的长度。 
  简略证明: 
假设最长上升子序列长度为K’,则其中任意两辆不会进入同一个轨道,
因此K≥K’。至于K=K’可由数学归纳法详细证明。 
  用O(N²)的DP方法求最长上升子序列。 
100分做法: 
  用二分法或树状数组(线段树)优化DP,时间复杂度O(NlogN)。 
 
另:直接分析搜索过程, 可以得到O(N²)的构造方法, 加上一个二分就可以满分。
(略) 

#include
#include
inline int readint()
{
    int i=0,f=1;
    char ch;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
    for(;ch>='0' && ch<='9';ch=getchar())
        i=(i<<3)+(i<<1)+ch-'0';
    return i*f;
}
int main()
{
	int n,a[100001],k[100001],tot=1;
	bool p;
	n=readint();
	for(int i=1;i<=n;++i) a[i]=readint();
	k[tot]=a[1];
	for(int i=2;i<=n;++i)
	{
		p=true;
		for(int j=1;j<=tot;++j)
			if(a[i]

var
n,tot,i,j: longint;
a,k:array [0..100000] of longint;
p: boolean;
begin
        read(n);
        for i:=1 to n do read(a[i]);
        tot:=1;
        k[tot]:=a[1];
        for i:=2 to n do begin
                p:=true;
                for j:=1 to tot do
                        if a[i]


import java.util.*;
public class Main
{
public static void main(String[] args)
{
	int n,tot,i,j;
	boolean c;
	int [] a=new int[100010];
	int [] k=new int[100010];
	Scanner input = new Scanner(System.in);
	n=input.nextInt();
	for(i=1;i<=n;i++) a[i]=input.nextInt();
	tot=1;
	k[tot] = a[1];
	for(i=2;i<=n;i++)
	{
		c = true;
		for(j=1;j<=tot;j++)
			if( a[i] < k[j] )
			{
				c=false;
				k[j] = a[i];
				break;
			}
		if( c==true ) k[++tot]=a[i];
	}
	System.out.println(tot);
}
}


你可能感兴趣的:(C++,Pascal,Java)