214 单调递增子序列(二)【lis】
2015-08-28 11:25
134 查看
单调递增子序列(二)
时间限制:1000 ms | 内存限制:65535 KB难度:4
描述
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
输入有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
7 1 9 10 5 11 2 13 2 2 -1
样例输出
5 1
求单调子序列的长度,用二分的方法比较好,一般都不会超时,stl 里面提供了二分的函数,灵活使用的话,很简洁,很方便,有兴趣的可以自己构造个二分查找函数.........
也是第一次这样做 lis 的题目,思想都一样,只是具体处理的细节有点区别....
两个二分查找函数介绍(x 数组需要查找的部分是有序的):
lower_bound(x+n,x+m,s) 的用法是:在 数组 x
到x[m-1] 中的元素中找到一个大于等于 s 的下标最小的元素,返回地址.....
upper_bound(x+n,x+m,s) 的用法是:在 数组 x
到x[m-1] 中的元素中找到一个大于(注意没有等于) s 的下标最小的元素,返回地址.....
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 0x3f3f3f3f
int x[1000005];
int main()
{
int n,a;
while(~scanf("%d",&n))
{
memset(x,maxn,sizeof(x));
for(int i=0;i<n;++i)
{
scanf("%d",&a);
x[lower_bound(x,x+n,a)-x]=a;//更新位置
}
printf("%d\n",lower_bound(x,x+n,maxn)-x);//输出长度!
}
return 0;
}
相关文章推荐
- 九度OJ 题目1125:大整数的因子
- iOS AutoLayout自动布局中级开发教程(8)-VisualFormat可视化格式语言创建约束
- 使用continue语句
- 流量阶梯单价计费,并非想象中那样美好
- 产品设计想法
- 经过验证过的接收系统广播
- Centos 上使用Mono+MVC5+WebApi+Sqlite
- 010editor 破解 扩展
- MongoDB跳出循环的两种方式
- Linux设备驱动模型的private_data 简单理解
- 【后缀数组之SA数组】【真难懂啊】
- nginx+tomcat集群负载均衡下tomcat故障后的的会话转移
- 生成注释
- 为什么匿名内部类参数必须为final类型
- 百度牵手大悦城 相爱相杀的零售与互联网需要新玩法
- 在textView中输入时避免键盘的遮挡
- 简单的邮件发送
- Linux下基于HTTP协议带用户认证的GIT开发环境设置
- 第一次作业
- fopen与读写的标识r,r+,rb+,rt+,w+.....