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