NOIP2013提高組 花匠

2021-08-07 13:04:29 字數 1385 閱讀 6941

題目描述

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。

具體而言,棟棟的花的高度可以看成一列整數h_1, h_2, … , h_n。設當一部分花被移走後,剩下的花的高度依次為g_1, g_2, … , g_m,則棟棟希望下面兩個條件中至少有乙個滿足:

條件 a:對於所有的1 < i< m/2,g_2i > g_2i-1,且g_2i > g_2i+1;

條件 b:對於所有的1< i< m/2,g_2i < g_2i-1,且g_2i < g_2i+1。

注意上面兩個條件在m = 1時同時滿足,當m > 1時最多有乙個能滿足。

請問,棟棟最多能將多少株花留在原地。

輸入描述

輸入的第一行包含乙個整數 n,表示開始時花的株數。

第二行包含 n 個整數,依次為h_1, h_2,… , h_n,表示每株花的高度。

輸出描述 output description

輸出一行,包含乙個整數 m,表示最多能留在原地的花的株數。

樣例輸入 sample input

5 5 3 2 1 2

樣例輸出 sample output

資料範圍及提示 data size & hint

對於 20%的資料,n ≤ 10;

對於 30%的資料,n ≤ 25;

對於 70%的資料,n ≤ 1000,0 ≤ h_i ≤ 1000;

對於 100%的資料,1 ≤ n ≤ 100,000,0 ≤ h_i ≤ 1,000,000,所有的h_i隨機生成,所有隨機數服從某區間內的均勻分布。

這裡用的貪心策略解決:

貪心策略尋找最多拐點數:

分兩種情況討論:偶數高還是矮;

1.對於偶數高的,找奇數根時應找盡量矮的,找偶數根時應找盡量高的,替代現有值(之前的值不會改動)

一旦碰到不滿足的就找到下一根的初始值了

2.對於偶數矮的則反之。

用單調佇列實現較快

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=100005;

int a[maxn],ans,q[maxn],top=0,n;

void run1()//偶數高

ans=max(ans,top);

} void run2()//偶數矮

ans=max(ans,top);

}int main()

NOIP2013提高組 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOIP 2013提高組 花匠 擺花

演算法 dp 貪心 題解 1 動態規劃 令f i 0.1 為兩種條件下前i株花的最大保留數量,狀態轉移方程 f i 0 max f j 1 1 j i 1.1 h i h j f i 1 max f j 0 1 j i 1.1 h i 初始化 f i 0 f i 1 1,這樣時間複雜度是o n 2 ...

Noip2013提高組day2 花匠

我們把原序列大概抽象在函式圖上,就會得出這樣的結果 如下圖 顯然,圈出來的點就是我們要保留的,不可能存在刪掉一大段會存在更優的情況。做法就是每次順著找乙個最高的點,再找乙個最低的點,如果存在相同的則視為乙個點。include include include define fo i,j,k for i...