華為筆試題 合唱隊

2021-09-25 02:42:13 字數 1176 閱讀 6767

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

說明:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。 

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk,   則他們的身高滿足存在i(1<=i<=k)使得t1ti+1>......>tk。 

你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。 

輸入描述:

整數n輸出描述:

最少需要幾位同學出列

輸入例子:

8

186 186 150 200 160 130 197 200

輸出例子:
4

思路:第一種想法比較容易想到的是列舉處於中間位置的身高的值mid,然後根據mid所處的位置,對於0-mid-1部分求最大遞增子串行,對mid+1~n求最大遞減子串行。

很明顯的是複雜度為o(n^3),超時;

優化的方法:容易了解到,只要求得第i個位置,從0~i的遞增子串行,以及從i~n-1的遞減子串行即可;so,我們可以求得從0~n-1依次遞增子串行,然後倒著求遞增子串行;分別求出每乙個位置兩者所得的子串行之和的最大值即可獲得answer;

這樣時間複雜度為o(n^2);

**如下:

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 1000067

intdp1[maxn] ,dp2[maxn], h[maxn] , ans;89

void solve(int n , int &ans)19}

20 dp2[n-1] = 1;21

for(int i = n-2 ; i >= 0 ; i --)

27 max1 = max(max1 , dp1[i] +dp2[i]);28}

29 ans =max1 ;30}

3132

intmain()

45return0;

46 }

合唱隊 華為

計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得t1ti 1 ...

華為OJ合唱隊

描述 計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得titi...

華為oj 合唱隊

這個題目可以分解成正序和逆序的最大上公升子串行的問題來處理,對每個數字存放以當前數字為結尾時的最大上公升子串行數,只需要對前面的每個數進行比較,找到比當前數字小的數字,並且上公升子串行長度最大的作為當前的最大值,即for i 1 ia j dp j 1 dp i dp i dp j 1 最後對每個數...