題目描述
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。
具體而言,棟棟的花的高度可以看成一列整數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...