P1091 合唱隊形

2021-09-29 10:35:47 字數 1338 閱讀 9412

題目名稱:合唱隊形

題目描述:

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

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2,…,k他們的身高分別為t1,t2,…,tk, 則他們的身高滿足t1 <…< ti > ti+1 >…> tk (1≤i≤k)。(中間高兩邊低)。

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

輸入格式:

共二行。

第一行是乙個整數n(2≤n≤100),表示同學的總數。

第二行有n個整數,用空格分隔,第i個整數ti(130≤ ti ≤230)是第i位同學的身高(厘公尺)。

輸出格式:

乙個整數,最少需要幾位同學出列。

樣例輸入:

8186 186 150 200 160 130 197 220

樣例輸出:

4(100%資料:n ≤ 100)

解題思路:

題目要求,讓最少的同學出列,得到最後的隊形要求兩邊低,中間高,就說明,存在乙個同學(下標為ki),滿足 1到ki 中最長上公升的子串行就是 1-ki 中剩餘的同學,ki-n 中最長下降的子串行就是ki-n中剩餘的同學。使剩餘的同學最多。

這樣就可以求出 1到n 的最長上公升子串行,再求 1到n 的最長下降子串行( n到1 的最長上公升子串行),

然後再列舉 ki ,求出剩餘同學最多的個數,得出最少需要幾位同學出列。

**:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

ll n,max=0;

ll dp[

101]

,dp2[

101]

;ll a[

105]

;int

main()

dp[1]

=1;for

(int i=

2;i<=n;i++)}

}}dp2[n]=1

;for

(int i=n-

1;i>=

1;i--)}

}}ll k;

for(

int i=

1;i<=n;i++)}

cout<1

}

P1091 合唱隊形

n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,...

P1091 合唱隊形

nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足t1 ti 1 t...

P1091 合唱隊形

題目描述 nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足 t1 ...