花匠(codevs 3289)題解

【問題描述】

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

【樣例輸入】

    5 
    5 3 2 1 2

【樣例輸出】

    3

【解題思路】

     本題爲NOIP2013提高組day2第二題,本人認爲該題應該是第一題的難度……之所以放在第二題,也許是因爲條件寫得醜了點怕別人看不清。看清條件這道題就很簡單了。

     這個條件的意思就是讓你找轉折點的數量即g(i-1)<gi>g(i+1)或g(i-1)>gi<g(i+1),gi即是轉折點。

     首先可以肯定的是,當花的數目爲1的時候,可以直接輸出1。首尾兩株花都肯定是可以留下的,因此,當花的數目大於等於2時,我們可以將答案初始化爲2,然後加上轉折點的數目即可,代碼沒超過25行……

【代碼實現】

var a:array[0..100001] of longint;
    w,n,i,ans:longint;
begin
 readln(n);
 a[0]:=-maxlongint;
 for i:=1 to n do
  begin
   inc(w);
   read(a[w]);
   if a[w]=a[w-1] then
    dec(w);
  end;
 if w=1 then
  begin
   writeln(1);
   halt;
  end;
 ans:=2;
 for i:=2 to w-1 do
  if ((a[i]>a[i-1])and(a[i]>a[i+1]))or((a[i]<a[i-1])and(a[i]<a[i+1])) then
   inc(ans);
 writeln(ans);
end.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章