NYOJ214
单调递增子序列(二)
- 描述
-
给定一整型数列{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型整数)! - 输出
- 对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
- 这个与单调递增子序列(一)有些不同,
- (一)
- 在单调递增子序列一中,可以用一个数组保存当前位置之前的最大子序列长度,可以在一次遍历数组串,每次查询之前的数组小于当前数的最大值,这样的
- 时间复杂度就是0 + 1 + 2 + ... + n-1 = (n-1)*n/2 即O(n2)
- 例如输入:【2,3,1,2,3】
- 结果数组:【1,0,0,0,0】
- 【1,2,0,0,0】
- 【1,2,1,0,0】
- 【1,2,1,2,0】
- 【1,2,1,2,3】
- 结果是3
- (二)的话可以用一个数组记录当前最大字符串长度,判断当前数与数组顶部的值大小,(1)如果大于数组顶的数则直接添加到尾部,数组长度加1
- (2)在数组中找到一个数,这个数是大于等于当前数的最小的
- (可以用二分法时间复杂度O(nlogn))
- 比如输入【2,3,1,2,3】
- 数组变化:
- 【2】
- 【2,3】
- 【1,3】
- 【1,2】
- 【1,2,3】
- 不过这个方法只能求出最大递增子序列长度
-
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int riseSubString(int a[], int n)
{
int i,l,r,m,s[],top = ;
if (n == )
return ;
s[] = a[];
for (i=; i < n; i++)
{
if (s[top] < a[i])
s[++top] = a[i];
else
{
l = ;
r = top;
m = top / ;
while ((l + ) < r) //二分,l与r间隔1时结束循环,再判断哪个是大于a[i]最小值
{
if (a[i] <= s[m])
{
r = m;
m = (r+l)/;
}
else
{
l = m;
m = (l+r)/;
}
}
if (s[l] > a[i])
s[l] = a[i];
else
s[r] = a[i];
}
}
return top + ;
}
int main()
{
int a[];
int n,i;
while (scanf("%d",&n) != -){
for (i=; i < n; i++)
scanf("%d",&a[i]);
printf("%d\n",riseSubString(a,n));
}
return ;
}
NYOJ214的更多相关文章
- NYOJ-214 单调递增子序列(二) AC 分类: NYOJ 2014-01-31 08:06 233人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> int len, n, i, j; int d[100005], a[100005]; int bin ...
- NYOJ-214 单调递增子序列(二) TLE 分类: NYOJ 2014-01-28 22:57 171人阅读 评论(0) 收藏
#include<stdio.h> #include<stdlib.h> #define max(x,y) x>y?x:y #define MAXX 100005 int ...
随机推荐
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- mongodb 2.6 window 安装启动服务
安装目录:C:\Program Files\MongoDB 2.6 Standard\ 创建目录:D:\mongodb\data 通过cmd,执行如下命令: cd C:\Program Files ...
- 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append性能好
如果在编写代码的过程中大量使用+进行字符串评价还是会对性能造成比较大的影响,但是使用的个数在1000以下还是可以接受的,大于10000的话,执行时间将可能超过1s,会对性能产生较大影响.如果有大量需要 ...
- [BIM]案例
以下是中建三局BIM小组的项目,用以参考: BIM协同设计与质量控制 现实建筑物实体都是以三维空间状态存在,若用三维设计表达更具有优势.如复杂管综设计,一般情况下,二维AutoCAD设计是在建筑.结构 ...
- 记一次SortedDictionary的不当使用
起初想用SortedDictionary做游戏中的排行榜,代码如下: using UnityEngine; using System; using System.Collections; using ...
- mongoDB Replica集群配置(1主+1从+1仲裁)
1.mongoDB节点介绍 主节点(Primary) 在复制集中,主节点是唯一能够接收写请求的节点.MongoDB在主节点进行写操作,并将这些操作记录到主节点的oplog中.而从节点将会从oplog复 ...
- Python学习笔记-Day2-Python基础之列表操作
列表的常用操作包括但不限于以下操作: 列表的索引,切片,追加,删除,切片等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(list) 使 ...
- 高效通信模型之 - 网络通信I/O模式( Windows)
#Socket事件 >FD_CONNECT:通常由Client端socket调用socket API函数时触发 >FD_ACCEPT:通常发生在server端的事件 >网络传输服 ...
- 2016 Al-Baath University Training Camp Contest-1 I
Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...
- 2016年11月12日 星期六 --出埃及记 Exodus 20:3
2016年11月12日 星期六 --出埃及记 Exodus 20:3 "You shall have no other gods before me.除了我以外,你不可有别的 神.