花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定
把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希
望剩下的花排列得比較別緻。
具體而言,棟棟的花的高度可以看成一列整數h1,h2..hn。設當一部分花被移走後,剩下的花的高度依次為g1,g2..gn,則棟棟希望下面兩個條件中至少有乙個滿足:
條件 a:對於所有g(2i)>g(2i-1),g(2i)>g(2i+1)
條件 b:對於所有g(2i)
輸入格式:
輸入檔案為 flower .in。
輸入的第一行包含乙個整數n,表示開始時花的株數。
第二行包含n個整數,依次為h1,h2..hn,表示每株花的高度。
輸出格式:
輸出檔案為 flower .out。
輸出一行,包含乙個整數m,表示最多能留在原地的花的株數。
輸入樣例#1:
5 5 3 2 1 2
輸出樣例#1:
3【輸入輸出樣例說明】
有多種方法可以正好保留 3 株花,例如,留下第 1、4、5 株,高度分別為 5、1、2,滿
足條件 b。
【資料範圍】
對於 20%的資料,n ≤ 10;
對於 30%的資料,n ≤ 25;
對於 70%的資料,n ≤ 1000,0 ≤ ℎi≤ 1000;
對於 100%的資料,1 ≤ n ≤ 100,000,0 ≤ hi≤ 1,000,000,
所有的hi 隨機生成,所有隨機數服從某區間內的均勻分布。
據說是可以用樹狀陣列或線段樹做出來的
但是根本上還是貪心的思想,還把o(n)的演算法變成了o(nlog2n)
(重點是還那麼難打)
樸素dp只有70分
只能寫乙個最最最最容易想也最容易寫的貪心了
貪心的想法真的超級好想
最終剩下的花一定是一大一小一大或一小一大一小的模型排列的
而且最後問的是最後最多總共可以剩下多少盆花
那我們完全沒有必要去在意留下了哪一盆花
只要將有多少個上公升序列以及多少個下降的序列求出來就可以了
因為這些序列一定要留下乙個才能滿足最後的模型的前提下取到最大值
#include
#include
using
namespace
std;
int n,h[100005],ans;
inline
int read()
void input()
void work1()
printf("%d\n",ans+1);
}void work()
printf("%d\n",ans+1); //因為沒有算第一株花所以答案還要加一
}int main()
NOIP 2014 Day2T2 尋找道路
題目中文,不需要我說,直接講思路 題目要求找到一條從起點到終點的路徑,而且保證最短的前提下,每個點的出邊連線的點都要能到達終點,so 第一步,反向建圖,跑一遍bfs,確定能到達終點的所有點 第二步,減掉連著不能到達終點的點的點以及不能到達終點的點,用乙個隨便什麼陣列記錄能用的點就好了 第三步,正常的...
NOIP2014 day2 t2 尋找道路
尋找道路 noip2014 day2 t2 描述在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題...
NOIP 2012 Day2T2 借教室題解
題目描述 description 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第i天學校有...