洛谷 1091 合唱隊行

2021-10-02 18:12:15 字數 1879 閱讀 8897

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

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2,…,k,他們的身高分別為t_1,t_2,…,t_k, 則他們的身高滿足t

1t_1

t1​<…i

t_iti

​>ti+

1t_

ti+1

​>…>tk(

1≤i≤

k)

t_k(1 \leq i \leq k)

tk​(1≤

i≤k)

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

共二行。

第一行是乙個整數n(2

≤n

≤100

)n(2 \le n \le 100)

n(2≤n≤

100)

,表示同學的總數。

第二行有n個整數,用空格分隔,第i個整數ti(

130≤ti

≤230

)t_i(130 \le t_i \le 230)

ti​(13

0≤ti

​≤23

0)是第i位同學的身高(厘公尺)。

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

輸入 #1複製

8

186 186 150 200 160 130 197 220

輸出 #1複製

4
對於50%的資料,保證有n≤20

n \le 20

n≤20

;對於全部的資料,保證有n

≤100

n \le 100

n≤100。

其實思路就是挺好想的,因為資料規模不大,所以列舉以第 i 個數為最高點時的佇列長度,然後選出最長的即可得到排除最少的人數。

而如何計算最長佇列呢?很顯然,只要算出 i 之前的最長公升序子串行(並且末尾元素小於第 i 個元素)和 i 之後的最長降序子串行(並且首元素小於第 i 個元素)。

/*思路:轉換思路 -> 求最長公升序子串行和最長降序子串行 */

#include

#include

#include

using

namespace std;

const

int max =

110;

int n;

struct data

datas[max]

;int results[max]

;void

get_maxdecrease()

}//獲取以site為結尾的最大長度

void

get_maxincrease()

}void

init()

intget_right

(int i)

intget_left

(int i)

intget_ans()

int mymin = int_max;

for(

int i =

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

(mymin > results[i]

) mymin = results[i]

;return mymin;

}int

main()

這道題我一開始做錯了,至於原因我也不陳述了(比較麻煩),但結論是,對於熟悉或者工具類的演算法我們不要隨意根據題更改,而要盡量像呼叫api一樣使用它們。這樣做有兩個好處,一是不容易出錯,二是久而久之這些常用**(例如本題的最長子序列、二分查詢之類的)會越來越熟悉。

洛谷 1091 合唱隊形

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

洛谷 P1091 合唱隊形

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

洛谷 P1091 合唱隊形

p1091 合唱隊形 2k 通過 4.8k 提交 題目提供者洛谷onlinejudge 標籤 noip提高組 2004 雲端評測 難度 普及 提高 提交 討論 題解 最新討論 描述是啥玩意?不能加檔案讀 參考,絕對ac,fighting 動 參考 資料太大了 n 1000 題目描述 n位同學站成一排...