出操隊形(LIS)

2022-07-09 21:51:13 字數 1335 閱讀 3021

題目描述:

在讀高中的時候,每天早上學校都要組織全校的師生進行跑步來鍛鍊身體,每當出操令吹響時,大家就開始往樓下跑了,然後身高矮的排在隊伍的前面,身高較高的就要排在隊尾。突然,有一天出操負責人想了乙個主意,想要變換一下隊形,就是當大家都從樓上跑下來後,所有的學生都隨機地佔在一排,然後出操負責人從隊伍中抽取出一部分學生,使得隊伍中剩餘的學生的身高從前往後看,是乙個先公升高後下降的「山峰」形狀。據說這樣的形狀能夠給大家帶來好運,祝願大家在學習的道路上勇攀高峰。(注,山峰只有一邊也符合條件,如1,1、2,2、1均符合條件)

輸入:

輸入可能包含多個測試樣例。

對於每個測試案例,輸入的第一行是乙個整數n(1<=n<=1000000):代表將要輸入的學生個數。

輸入的第二行包括n個整數:代表學生的身高(cm)(身高為不高於200的正整數)。

輸出:

對應每個測試案例,輸出需要抽出的最少學生人數。

樣例輸入:

6

100 154 167 159 132 105

5152 152 152 152 152

樣例輸出:

0

4思路:

這道題目直接使用兩次lis就可以了,一次從前往後,一次從後向前。然後分別假設每個人為最高的人,分別算出他前面和後面需要去掉的人的和,最後在其中找最小的就可以了。為了防止超時,在計算lis的時候使用二分來查詢要插入的位置,演算法的複雜度為o(nlgn)。

具體**:

1 #include 2

3int 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 }

view code

合唱隊形 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...