華為練習題 合唱隊

2021-09-24 03:49:24 字數 1378 閱讀 7046

計算最少出列多少位同學,使得剩下的同學排成合唱隊形

說明:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。 合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk, 則他們的身高滿足存在i(1<=i<=k)使得t1…>tk。 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

這其實是一道求解最長上公升子串行的問題,所謂的合唱隊形就是乙個最長上公升子串行的拼接,只要求出從佇列首(左邊)到位置i的最長上公升子串行,以及從佇列尾到位置i的最長上公升子串行,將兩個子串行的長度相加即為合唱隊的總長度,另外我們還知道總的人數,減一下就知道需要出列多少人了。

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 ...