計算最少出列多少位同學,使得剩下的同學排成合唱隊形這其實是一道求解最長上公升子串行的問題,所謂的合唱隊形就是乙個最長上公升子串行的拼接,只要求出從佇列首(左邊)到位置i的最長上公升子串行,以及從佇列尾到位置i的最長上公升子串行,將兩個子串行的長度相加即為合唱隊的總長度,另外我們還知道總的人數,減一下就知道需要出列多少人了。說明:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。 合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk, 則他們的身高滿足存在i(1<=i<=k)使得t1…>tk。 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
import bisect
defsolution
(mylist)
: dp =
[9999]*
len(mylist)
dp[0]
= mylist[0]
num =
1)for i in
range(1
,len
(mylist)):
pos = bisect.bisect_left(dp, mylist[i]
) dp[pos]
= mylist[i]1)
return num
while
true
:try
: n =
int(
input()
) mylist =
list
(map
(int
,input()
.split())
) left = solution(mylist)
right = solution(mylist[::
-1])
right = right[::
-1] result =
0for i in
range
(n):
if left[i]
+ right[i]-1
> result:
result = left[i]
+ right[i]-1
print
(n - result)
except
:break
當然這裡我只寫了最長上公升子串行的一種求解方法,其他的方法可以參看我的另一篇blog[leetcode]——longest increasing subsequence,希望能有所收穫! 華為機試練習題 37 合唱隊
題目 描述 計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得t...
華為機試練習題 37 合唱隊
題目 描寫敘述 計算最少出列多少位同學。使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請當中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這種一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得...
合唱隊 華為
計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得t1ti 1 ...