洛谷 P1020 导弹拦截

洛谷 P1020 导弹拦截

题意:

自己读题吧…

分析一下:

本题实则是求最长不升子序列长度和最长上升子序列长度(如不理解,自行思索)
此处附上一个我认为很好的关于单调子序列的博客:
https://www.cnblogs.com/kindleheart/p/8859151.html
PS:upper_bound和lower_bound函数只能用于递增序列,但是,凡是有个但是,稍加操作也可以用于递减。就好比sort()默认按升序排序,但价格cmp函数之后就可以降序排序
关于upper_bound和lower_bound函数,请参见:https://blog.csdn.net/qq1337715208/article/details/81072709

代码君:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int h[maxn], a1[maxn], a2[maxn];
int main(int argc, char const *argv[])
{
    // freopen("input.txt", "r", stdin);
    int n = 1;
    while (~scanf("%d", h + n))
    {
        ++n;
    }
    n--;    //读入完成后n多加了1,我也不知道为啥,我也不敢问啊...

    int len1 = 1, len2 = 1;
    a1[1] = h[1];
    a2[1] = h[1];
    for (int i = 2; i <= n; ++i)
    {
        if (a1[len1] >= h[i])
            a1[++len1] = h[i];
        else
            *upper_bound(a1 + 1, a1 + 1 + len1, h[i], greater<int>()) = h[i];

        if (a2[len2] < h[i])
            a2[++len2] = h[i];
        else
            *lower_bound(a2 + 1, a2 + 1 + len2, h[i]) = h[i];
    }
    printf("%d\n%d\n", len1, len2);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值