题目:http://www.luogu.org/problem/show?pid=1970#
分析:这道题目的本质是求出一个最长的数字序列,使得这个序列中的数字一大一小、一大一小。
①连续的相同的数字,最多只有一个会使用到。这个显然。合并连续而相同的数字有助于求出波峰波谷。
②求出波峰波谷数目+2就是答案了。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=100005;
int n,nn,data[Tmax];
long long int ans;
void work()
{
int i;
for(i=2;i<n;i++)
if((data[i]>data[i-1]&&data[i]>data[i+1])||(data[i]<data[i-1]&&data[i]<data[i+1]))
ans++;
return;
}
int main()
{
int i,a;
scanf("%d",&nn);
for(i=1;i<=nn;i++)
{
scanf("%d",&a);
if(a==data[n]) continue;
data[++n]=a;
}
work();
printf("%lld",ans+2);
return 0;
}