题解 | #合唱队#

合唱队

https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

import bisect

def find(l):
    tail,cl = [],[]
    cnt = 0
    for i in l:
        index = bisect.bisect_left(tail,i)
        if index==len(tail):
            tail.append(i)
            cnt += 1
            cl.append(cnt)
        else:
            tail[index]=i
            cl.append(cnt)
    return cl


n = int(input())
sl = list(map(int,input().split()))
print(n-max([x+ y for x,y in zip(find(sl),find(sl[::-1])[::-1])])+1)


函数使用经典的tail数组找最长递增子序列,然后运用两次得到一个每个位置的左边最长增长长度和右边最长增长长度,每个位置的两边最长长度相加取最大值即为合唱队的最大长度+1,这时使用n减这个值加1即为所求的最小剔除

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务