题目描述
花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定
把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希
望剩下的花排列得比较别致。
具体而言,栋栋的花的高度可以看成一列整数h1,h2..hn。设当一部分花被移走后,剩下的花的高度依次为g1,g2..gn,则栋栋希望下面两个条件中至少有一个满足:
条件 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时最多有一个能满足。
请问,栋栋最多能将多少株花留在原地。
输入输出格式
输入格式:
输入文件为 flower .in。
输入的第一行包含一个整数n,表示开始时花的株数。
第二行包含n个整数,依次为h1,h2..hn,表示每株花的高度。
输出格式:
输出文件为 flower .out。
输出一行,包含一个整数m,表示最多能留在原地的花的株数。
输入输出样例
输入样例#1:
5
5 3 2 1 2
输出样例#1:
3
分析:
不要看上面的描述这么恶心,其实就是在一个无序数列中
找到尽量多的数,组成一个波浪序列
这里写代码片
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
int now,fro,tt=0;
int f=-1;
if (n<=2)
{
printf("%d",n);
return 0;
}
for (int i=1;i<=n;i++)
{
scanf("%d",&now);
if (i==1)
{
fro=now;
continue;
}
if (f==-1)
{
if (now<fro) f=0,tt++; //down
else if (now>fro) f=1,tt++;
fro=now;
continue;
}
if (now<fro&&f==1)
{
tt++;
f=0;
}
else if (now>fro&&f==0)
{
tt++;
f=1;
}
fro=now;
}
printf("%d",tt+1);
}