题目描述
花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定
把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希
望剩下的花排列得比较别致。
具体而言,栋栋的花的高度可以看成一列整数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 }