题目背景

自行脑补,

题目描述

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

输入输出格式

输入格式:

输入共2行。

 第 1 行包含1个正整数N,表示N辆列车。

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

输出格式:

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

输入输出样例

输入样例#1:

3
1 2 3
输出样例#1:

3
输入样例#2:

9
1 3 2 4 8 6 9 5 7
输出样例#2:

5

说明

 对于30%的数据,N≤10;

 对于70%的数据,N≤2000;

 对于100%的数据,N≤100000

分析:

属于一类模型转换的题。此题在poj之旅中应有原题。在此重述,加深印象。

我们可以假设结果是K,假设这个序列的最长上升序列为L,我们可以证明出K>=L,所以K的最小值只能是L。

具体证明:

由于问题是一个队列,只能先进先出,所以K的最小值实际就是将原序列划分成几个下降序列,如果K<=L,那么就无法将L个递增的数字无矛盾的放入K个下降序列,即必然在某一个下降序列中存在a>b的。这其实就是鸽笼原理。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int a[maxn];
int n;
int main(){
scanf("%d",&n);
memset(a,0x3f,sizeof(a));
for (int i=;i<=n;i++){
int x;
scanf("%d",&x);
*lower_bound(a+,a+n+,x)=x;
}
printf("%d",lower_bound(a+,a+n+,a[])-a-);
return ;
}

最新文章

  1. 【原】FMDB源码阅读(二)
  2. HTTP参数污染
  3. Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
  4. Java动态代理一Proxy
  5. 【知识点】安全存储服务(SSS)目标应用程序类型
  6. Java 中Comparator 的使用,实现集合排序
  7. 刚才建立一个 swift 中文讨论社区,欢迎大家參与讨论
  8. detach() 与remove()
  9. SecurityException
  10. [C++学习历程]中级部分 OpenGL第一个例子实现
  11. 让simplejson支持datetime类型的序列化
  12. jquery checkbox的使用
  13. ZVulDrill渗透环境搭建及部分题目writeup
  14. 【liferay】4、liferay的权限体系
  15. 深度学习框架Keras安装
  16. win64+anaconda+xgboost(转)
  17. LAMP:用yum安装
  18. 20155307 2016-2017-2 《Java程序设计》第8周学习总结
  19. Go语言基础-序言
  20. Zookeeper概述和基本概念

热门文章

  1. 修改文本框和文本域placeholder样式
  2. memcache课程---1、memcache介绍及安装(memcache作用)
  3. Java-MyBatis-MyBatis3-XML映射文件:insert, update 和 delete
  4. 01.visual studio 2017添加菜单
  5. java基础之Integer包装类
  6. Python - 基本数据类型及其常用的方法之数字与字符串
  7. InceptionV3代码解析
  8. koa中同步与异步的写法
  9. 阿里云 Aliplayer高级功能介绍(九):自动播放体验
  10. mysql高级教程(二)-----性能分析