華為OJ 024 合唱隊

2021-09-24 03:12:21 字數 2601 閱讀 7801

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

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

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

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

整數n最少需要幾位同學出列

示例1

8

186 186 150 200 160 130 197 200

4
本題考查知識點:動態規劃、最大遞增子串行、動態記憶體分配

本題難度:中級

注意點:

1.輸入引數為字元指標指向的字串,需要先轉換為整形陣列,才能進行比較;

2.需要對入參進行判斷

/*

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

輸入引數:

int n : 最初佇列的n位同學 (2<=n<=50)

char* staturearray:n位同學的身高字串(保證只含數字和空格)

身高ti要求(130<=ti<=230)

輸出引數:

int* rst: 最少出列多少位同學,使得剩下的同學排成合唱隊形

返回值:

0: 成功; -1:異常

*//*解題思路:

首先計算每個數在最大遞增子串中的位置

186 186 150 200 160 130 197 200 quene

1 1 1 2 2 1 3 4 遞增計數

然後計算每個數在反向最大遞減子串中的位置--->計算反向後每個數在最大遞增子串中的位置

200 197 130 160 200 150 186 186 反向quene

1 1 1 2 3 2 3 3 遞減計數

然後將每個數的遞增計數和遞減計數相加

186 186 150 200 160 130 197 200 quene

1 1 1 2 2 1 3 4 遞增計數

3 3 2 3 2 1 1 1 遞減計數

4 4 3 5 4 2 4 5 每個數在所在佇列的人數+1(自己在遞增和遞減中被重複計算)

如160這個數

在遞增佇列中有2個人數

150 160

在遞減佇列中有2個人數

160 130

那麼160所在佇列中就有3個人

150 160 130

每個數的所在佇列人數表達就是這個意思

總人數 - 該數所在佇列人數 = 需要出隊的人數

*/int chorus(int n, char* staturearray, int* rst)

int max = 0;

/*int lis[n];//最長遞增子串行

int lds[n];//最長遞減子串行*/

int stu[20];

memset(stu,0,sizeof(int)*20);//陣列初始化

for (int i = 0; i < n; i++)//將字元指標指向的字串轉化為整形陣列

int *lis;

lis = (int *)malloc(n*sizeof(int));

int *lds;

lds = (int *)malloc(n*sizeof(int));

for(int i=0;istu[j]&&lis[j]+1>lis[i])

}} for(int i=n-1;i>=0;i--)

}} for(int i=0;imax)

}*rst = n - max +1;

return 0;

}

get的知識點:

1.最大遞增子串行:是指找到乙個給定序列的最長子序列的長度,使得子串行中的所有元素單調遞增

2.動態規劃:

3.atoi()函式

atoi():int atoi(const char *str );

功能:把字串轉換成整型數。

str:要進行轉換的字串

返回值:每個函式返回 int 值,此值由將輸入字元作為數字解析而生成。 如果該輸入無法轉換為該型別的值,則atoi的返回值為 0。

說明:當第乙個字元不能識別為數字時,函式將停止讀入輸入字串。

華為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 最後對每個數...

華為OJ 合唱隊

解題思路 實際上這是一道簡單動態規劃的題。但是一眼看上去不是很直觀。題目所謂的合唱隊形就是乙個最長上公升子串行的拼接。只要求出從佇列首到位置 i 的最長上公升子串行長度加上從隊尾開始到位置 i 的最長上公升子串行的長度就能求出合唱隊形的總長度。我們還知道總的人數,減一下就能得出要出列的人數了。求最長...