花匠(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.

 

你可能感兴趣的:(花匠(codevs 3289)题解)