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位同學站成一排...