題目描述:
在讀高中的時候,每天早上學校都要組織全校的師生進行跑步來鍛鍊身體,每當出操令吹響時,大家就開始往樓下跑了,然後身高矮的排在隊伍的前面,身高較高的就要排在隊尾。突然,有一天出操負責人想了乙個主意,想要變換一下隊形,就是當大家都從樓上跑下來後,所有的學生都隨機地佔在一排,然後出操負責人從隊伍中抽取出一部分學生,使得隊伍中剩餘的學生的身高從前往後看,是乙個先公升高後下降的「山峰」形狀。據說這樣的形狀能夠給大家帶來好運,祝願大家在學習的道路上勇攀高峰。(注,山峰只有一邊也符合條件,如1,1、2,2、1均符合條件)
輸入:
輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行是乙個整數n(1<=n<=1000000):代表將要輸入的學生個數。
輸入的第二行包括n個整數:代表學生的身高(cm)(身高為不高於200的正整數)。
輸出:
對應每個測試案例,輸出需要抽出的最少學生人數。
樣例輸入:
6樣例輸出:100 154 167 159 132 105
5152 152 152 152 152
04思路:
這道題目直接使用兩次lis就可以了,一次從前往後,一次從後向前。然後分別假設每個人為最高的人,分別算出他前面和後面需要去掉的人的和,最後在其中找最小的就可以了。為了防止超時,在計算lis的時候使用二分來查詢要插入的位置,演算法的複雜度為o(nlgn)。
具體**:
1 #include 2view code3int n; //
輸入的學生個數
4int data[1000005];5
int longest_x[1000005], r_longest_x[1000005];6
int temp_longest[1000005
]; 7
intans;89
int search_b(int count, int
x)10
23return
left;24}
25void
longest_x_f()
2640}41
void
r_longest_x_f()
4256}57
58int main(void)59
74return0;
75 }
合唱隊形 LIS
合唱隊形 openj bailian 2711 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 ...
FJUT 2399 合唱隊形 雙向lis
合唱隊形 timelimit 1000ms memorylimit 128mb 64 bit integer io format lld n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身...
P1091合唱隊形(LIS問題)
nn位同學站成一排,老師要請其中的 n kn k 位同學出列,使得剩下的kk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k,他們的身高分別為t 1,t 2,t kt1 t2 tk 則他們的身高滿足t 1 t t k 1 le i le k t1 ti...