zoukankan      html  css  js  c++  java
  • 花匠

    描述

    花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。

    具体而言,栋栋的花的高度可以看成一列整数h1, h2, … , hn。设当一部分花被移走后,剩下的花的高度依次为g1, g2, … , gm,则栋栋希望下面两个条件中至少有一个满足:

    条件 A:对于所有的1 <= i < n / 2,g_2i > g_2i−1,且g_2i > g_2i+1; 
    条件 B:对于所有的1 <= i < n / 2,g_2i < g2i−1,且g_2i < g_2i+1。
    此处2i及2i-1,2i+1都为下标。

    注意上面两个条件在m = 1时同时满足,当m > 1时最多有一个能满足。

    请问,栋栋最多能将多少株花留在原地。

    格式

    输入格式

    输入的第一行包含一个整数 n,表示开始时花的株数。

    第二行包含 n 个整数,依次为h1, h2,… , hn,表示每株花的高度。

    输出格式

    输出一行,包含一个整数 m,表示最多能留在原地的花的株数。

    样例1

    样例输入1[复制]

     
    5 
    5 3 2 1 2
    

    样例输出1[复制]

     
    3
    

    限制

    每个测试点1s。

    提示

    对于 20%的数据,n ≤ 10; 
    对于 30%的数据,n ≤ 25; 
    对于 70%的数据,n ≤ 1000,0 ≤ hi ≤ 1000; 
    对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤ hi ≤ 1,000,000,所有的h_i随机生成,所有随机数服从某区间内的均匀分布。

    来源

    NOIP 2013 提高组 day 2

    --------------------------------------------
    n^2动规的方法就是考场上写的,拿了80分。
    O(n)的方法就是找拐点,有几个拐点答案就是几
    第一次交WA了2个点,思考了以后发现如果是1 2 2 1会算出2,答案就错了,应当把相同的数字压缩在一起变成1 2 1,这样找拐点就对了
     1 var
     2   a:array[0..100001]of longint;
     3   i,j,n,nn,num,max,x:longint;
     4 begin
     5   read(nn);
     6   n:=0;
     7   a[0]:=-maxlongint;
     8   for i:=1 to nn do
     9     begin
    10       read(x);
    11       if x<>a[n] then
    12         begin
    13           inc(n);
    14           a[n]:=x;
    15         end;
    16     end;
    17   max:=0;
    18   //w
    19   a[0]:=-maxlongint;
    20   a[n+1]:=-maxlongint;
    21   num:=0;
    22   for i:=1 to n do
    23     if (a[i]>a[i-1])and(a[i]>a[i+1])or
    24        (a[i]<a[i-1])and(a[i]<a[i+1]) then inc(num);
    25   if num>max then max:=num;
    26   //M
    27   a[0]:=maxlongint;
    28   a[n+1]:=maxlongint;
    29   num:=0;
    30   for i:=1 to n do
    31     if (a[i]>a[i-1])and(a[i]>a[i+1])or
    32        (a[i]<a[i-1])and(a[i]<a[i+1]) then inc(num);
    33   if num>max then max:=num;
    34   //w
    35   a[0]:=-maxlongint;
    36   a[n+1]:=maxlongint;
    37   num:=0;
    38   for i:=1 to n do
    39     if (a[i]>a[i-1])and(a[i]>a[i+1])or
    40        (a[i]<a[i-1])and(a[i]<a[i+1]) then inc(num);
    41   if num>max then max:=num;
    42   //M/
    43   a[0]:=maxlongint;
    44   a[n+1]:=-maxlongint;
    45   num:=0;
    46   for i:=1 to n do
    47     if (a[i]>a[i-1])and(a[i]>a[i+1])or
    48        (a[i]<a[i-1])and(a[i]<a[i+1]) then inc(num);
    49   if num>max then max:=num;
    50   writeln(max);
    51 end.
    View Code
  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/zjhl2/p/3933399.html
Copyright © 2011-2022 走看看