luoguP1970 花匠

题目描述

花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定

把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希

望剩下的花排列得比较别致。

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

条件 A:对于所有g(2i)>g(2i-1),g(2i)>g(2i+1)

条件 B:对于所有g(2i)<g(2i-1),g(2i)<g(2i+1)

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

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

思路:看到条件A我们可以想到,(1表示低,2表示高)1212121的序列,看到条件二,我们可以想到2121212,所以分两种情况。代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #define  X  100000+7
 4 using namespace std;
 5 int a[X],f[X];
 6 int max(int x,int y)
 7 {
 8     return x>y?x:y;
 9 }
10 int main()
11 {
12     int n;
13     scanf("%d",&n);
14     for(int i=1;i<=n;++i)
15     {
16         scanf("%d",a+i);
17     }
18     int len=1,lot=1;
19     f[len]=a[1];
20     for(int i=2;i<=n;++i)//这里只介绍12121这种,因为下面跟这个完全相似
21     {
22         if(!(len&1))//判断是否是偶数
23         {
24             if(a[i]>f[len])//如果不是偶数,并且此时的高度大于这个序列的波谷
25             {
26                 len++;//让f序列的长度+1
27                 f[len]=a[i];//存下波峰
28             }
29             else//如果不是偶数,并且此时的高度小于这个序列的波谷
30             {
31                 f[len]=a[i];//贪心,让这个最小值替换了波谷(让波谷最小)(好好体会一下);
32             }
33         }
34         else
35         {
36             if(a[i]<f[len])//此时是偶数,并且此时的高度小于这个波峰
37             {
38                 len++;//让f的长度+1存下a
39                 f[len]=a[i];
40             }
41             else
42             {
43                 f[len]=a[i];//也是贪心思想,让波峰成为最大值
44             }
45         }
46     }
47     lot=len;
48     len=1;
49     f[1]=a[1];
50     for(int i=2;i<=n;++i)
51     {
52         if(!(len&1))
53         {
54             if(a[i]<f[len])
55             {
56                 len++;
57                 f[len]=a[i];
58             }
59             else
60             {
61                 f[len]=a[i];
62             }
63         }
64         else
65         {
66             if(a[i]>f[len])
67             {
68                 len++;
69                 f[len]=a[i];
70             }
71             else
72             {
73                 f[len]=a[i];
74             }
75         }
76     }
77     cout<<max(lot,len);
78 }

猜你喜欢

转载自www.cnblogs.com/tpgzy/p/8903706.html