题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
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
| 4
|
统计原序列,以i位同学身高作为最大值,左侧的最长递增序列LEFT;
原序列逆序后,以i位同学身高作为最大值,组成的最长递增序列,相当于原序列第n-i-1右侧递减序列的长度RIGHT;
则第i位作为最高位置的最长合唱队长度为LEFT[i]+RIGHT[n-i-1]:
代码:
while True:
try:
def f1(x1):
tempt=[1]
for i in range(1,len(x1)):
m1=1
for j in range(i):
if x1[i]>x1[j]:
m1=max(tempt[j]+1,m1)
tempt.append(m1)
return tempt
n=int(input())
data=[int(x) for x in input().split()]
#print(data)
d1=f1(data)
d2=data[::-1]
#print(d2)
d3=f1(d2)
#print(d1)
#print(d3)
d=[]
for i in range(n):
d.append(d1[i] + d3[n-i-1])
print(n-max(d)+1)
except:
break