以每一个同学为中心,分别计算左侧的最长递增子序列和右侧的最长递减子序列,然后记录最大值len(pos_tails)+len(neg_tails)+1,最后加的1是中心同学。

但是这么写是17/21,会超时

n = int(input().strip())
 
nums = list(map(int, input().split()))
r_nums = list(reversed(nums))
 
def get_incr_tails(its, max_num):
    tails = []
    for num in its:
        if num >= max_num:
            continue
        l, r = 0, len(tails)
        while l < r:
            m = (l+r) // 2
            if num <= tails[m]:
                r = m
            else:
                l = m + 1  # 防止队列重叠陷入死循环
        if l >= len(tails):
            tails.append(num)
        elif num < tails[l]:
            tails[l] = num
    return tails
 
# 以第i个同学为hi
max_queue_num = 0
for i in range(1, len(nums)-1):
    # 正序获取最大递增子序列的tails列表
    pos_tails = get_incr_tails(nums[:i], nums[i])
    # 倒序取出最大递增子序列的tails列表
    neg_tails = get_incr_tails(r_nums[:n-(i+1)], nums[i])
    if len(pos_tails) == 0 or len(neg_tails) == 0:
        continue
    curr_queue_num = len(pos_tails) + len(neg_tails) + 1
    if curr_queue_num > max_queue_num:
        max_queue_num = curr_queue_num
print(len(nums) - max_queue_num)