题解 | #小美打怪#

小美打怪

https://ac.nowcoder.com/acm/problem/261577

经典题目:最长递增子序列的变种。

我们先将满足所有小于的放到一个数组中,然后按照第一维度降序排序,如果相等,那么升序排序。然后找出第二维的最长递减子序列就是我们的答案。

为什么需要相等的时候升序排序呢? 因为题目要求了相等的不能够杀死,那么我们给他升序,那么找最长递减的时候就不可能选到。

这道题题目范围数据给的很小,只有,可以暴力dp,定义代表了数组的最长递增子序列长度,转移方程如下:

这样转移时间复杂度为,然后还有二分或者使用树状数组优化达到,这里给出二分写法。

import sys

sys.setrecursionlimit(100010)

read = sys.stdin.readline

if __name__ == "__main__":
    """
        最长递减子序列
    """
    n,h,a = map(int,read().split())
    H = list(map(int,read().split()))
    A = list(map(int,read().split()))
    arr = []
    for x,y in zip(H,A):
        if x < h and y < a:
            arr.append((x,y))
    arr.sort(key=lambda x:(-x[0],x[1]))
    g = []
    for x,y in arr:
        l = 0
        r = len(g)
        while l < r:
            m = (l + r) >> 1
            if g[m] >= y:
                l = m + 1
            else:
                r = m
        if l == len(g):
            g.append(y)
        else:
            g[l] = y
    print(len(g))

全部评论

相关推荐

01-03 12:06
复旦大学 Java
点赞 评论 收藏
分享
2025-11-22 02:49
已编辑
天津理工大学 golang
爱蜜莉雅碳也想进大厂:边学边背八股吧,时间很紧张,最主要的是暑期基本明年3月就开了,你试试看先花两个月速成,看能不能小厂实习或者无实习找暑期(虽然很难感觉)
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务