牛客网oi测试赛E旅行青蛙【LIS二分】

版权声明:⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄hiahiahia 欢迎斧正 https://blog.csdn.net/zhou_yujia/article/details/82427822

链接: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;
}

猜你喜欢

转载自blog.csdn.net/zhou_yujia/article/details/82427822