链接:https://www.nowcoder.com/acm/contest/181/E
来源:牛客网
题目描述
一只青蛙出去旅游,因为中国有一句古话说的好:“由简入奢易,由奢入俭难”,所以这只青蛙当看的当前景点比前面看过的景点差的时候,青蛙就会说“不开心”为了避免这只青蛙说“不开心”,并且使青蛙看的景点尽量的多,所以他请你帮忙给他安排一条线路,使青蛙可以看到尽量多的景点,并且不走回头路。
输入描述:
第一行为一个整数n,表示景点的数量 接下来n行,每行1个整数,分别表示第i个景点的质量
输出描述:
一个整数,表示青蛙最多可以看到几个景点
示例1
输入
10 3 18 7 14 10 12 23 30 16 24
输出
6
备注:
景点质量为1到n+23的整数 10<=n<23 10% 23<=n<233 30% 233<=n<2333 60% 2333<=n<23333 100%
long long ago写过LIS,今天捡起来了QAQ
发现二分又不会了
LIS正常来说是记录每一个位置结尾所能产生的最长长度
然后后来的和之前比这个数字小的比较,看是否能接上,长度++
所以,我们设计一个数组,维护以每一个数字为结尾最长的长度。具体看代码吧
by the way
upper_bound是找出大于某数的最小下标
low_bound是大于等于某数的最小下标
int pos3=lower_bound(num,num+6,7,greater<int>())-num; //返回数组中第一个小于或等于被查数的值
int pos4=upper_bound(num,num+6,7,greater<int>())-num;//返回数组中第一个小于被查数的值
记得写头文件algorithm
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int a[maxn],n,k;
int d[maxn],len;
void binary_search(int x)
{
/** int l=1,r=len,mid;
while(l<=r)
{
mid = (l+r)>>1;
if(d[mid]<=x) l = mid+1;
else r = mid-1;
}**/
int l=upper_bound(d,d+len,x)-d;
d[l]=x;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++) scanf("%d",a+i);
// memset(d,0,sizeof(d));
len=0,d[0]=a[0];
for(int i=1;i<n;i++)
{
if(d[len]<=a[i]) d[++len] = a[i];
else binary_search(a[i]);
}
printf("%d\n",len+1);
}
return 0;
}