题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述:
整数N
输出描述:
最少需要几位同学出列
输入:
8
186 186 150 200 160 130 197 200
输出:
4
代码如下:
import sys
def search(nums, target):
low, high = 0, len(nums)-1
pos = len(nums)
while low<high:
mid = (low+high)//2
if nums[mid] < target:
low = mid+1
else:
high = mid
pos = high
return pos
def deal(l,res):
b=[9999]*len(l)
b[0]=l[0]
res=res+[1]
for i in range(1,len(l)):
pos=search(b,l[i])
res+=[pos+1]
b[pos]=l[i]
return res
while True:
try:
n=int(input())
queue=[int(c) for c in input().strip().split()]
dp_1=[]
dp_2=[]
dp_1=deal(queue,dp_1)
queue.reverse()
dp_2=deal(queue,dp_2)
dp_2.reverse()
a=max([dp_1[i]+dp_2[i] for i in range(n)])
print (n-a+1)
except:
break