zoukankan      html  css  js  c++  java
  • 花匠(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.
  • 相关阅读:
    迭代器与生成器
    函数
    Java多线程
    JVM垃圾回收
    JVM内存模型
    面向对象的特征和原则
    Java代码规范
    安装yum
    虚机ping:www.baidu.com报错
    创建好centos7虚拟机之后连xshell连不上虚机
  • 原文地址:https://www.cnblogs.com/PengBoLiuXu/p/4538499.html
Copyright © 2011-2022 走看看