题解 | #合唱队#
合唱队
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即为所求的最小剔除
查看14道真题和解析
