题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
'''解析:
n位同学顺序不可改变,要抽出最小人数,使剩余人的身高符合 ^ / \ 三种走势之一(严格升序/降序)。
将每位同学i作为最高点,依次找出抽出人数,其中的最小值即为结果。
需要抽出的人数f(n) 计算方法:
同学i左面 符合严格升序的最多人数 l(i)
同学i右面 符合严格降序的最多人数 r(i)
同学i自己
队伍长度=l(i)+r(i)+1
需抽出的人数f(n)=n-(l(i)+r(i)+1)
'''
n=int(input())
h=list(map(int,input().split()))
#print(h)
l=[0]*n # 0*n列表,用于记录i左面有几个人
for i in range(n):
for j in range(i): # 不包括i
if h[i]>h[j] and l[j]+1>l[i]:
l[i] += 1
#print(l)
r=[0]*n # 0*n列表,用于记录i右面有几个人
for i in range(n-1,-1,-1): # 从右往左
for j in range(n-1,i,-1):
if h[i]>h[j] and r[j]+1>r[i]:
r[i] += 1
#print(r)
chorus=[l[i]+r[i]+1 for i in range(n)]
#print(chorus)
out=[n-chorus[i] for i in range(n)]
print(min(out))
'''
l=list(range(8-1,-1,-1))
print(l)
'''
联想公司福利 1500人发布

查看4道真题和解析