計算最少出列多少位同學,使得剩下的同學排成合唱隊形
說明: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 的最長上公升子串行的長度就能求出合唱隊形的總長度。我們還知道總的人數,減一下就能得出要出列的人數了。求最長...