Vijos1845 花匠

来源:互联网 发布:sql 截断日志 编辑:程序博客网 时间:2024/04/30 00:13
  • 题目大意:给定一列整数,求满足题中所给的条件的最长子序列的长度。

  • 思路:列举上几个i的值就可以发现,实际上题目要我们求一个最长摆动数列,并且数列中的每个数要么比它的左右两个数都小,要么就都大。这样我们只需遍历一遍数列求出波峰与波谷的个数最后加上两端的就行了。

  • 代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int maxn=100005;int n,a[maxn];int main(){    scanf("%d",&n);    if (n==1)    {        puts("1");        return 0;    }  //这里特判n=1的情况    bool flag;    int ans=1;    for (int i=1;i<=n;++i)      scanf("%d",&a[i]);    int k=1;    while (a[k]==a[k+1])       k++;    //如果前几项相同,需要一直找下去以确定一个起始趋势    if (a[k]<a[k+1])      flag=1;    else flag=0;    for (int i=k+2;i<=n;++i)    {        if (a[i]>a[i-1] && flag==1)          continue;        if (a[i]<a[i-1] && flag==0)          continue;        if (a[i]==a[i-1])          continue;        if (flag==1)          flag=0;        else flag=1;        ans++;    }      ans++;    printf("%d",ans);    return 0;}
0 0