Problem
Description
给你1-N的一个排列,数列中的数字互不相等,要求找出最长的子序列a,满足a1 > a2,a2 < a3,a3 > a4,a4 < a5……
Input
T 代表T组数据 T<=50
每组数据一行: n 代表给你n个数,然后就是n个数 N<=30000
Output
T行 每行一个数:
对于每组数据输出最长子序列的长度
Sample Input
4
5 1 2 3 4 5
5 5 4 3 2 1
5 5 1 4 2 3
5 2 4 1 3 5
Sample Output
1
2
5
3
Solution
这道题看上去很难,实际上我们只需要找到每一个序列的拐点就行了。拐点的个数就是答案的值。理由:因为这个数据是波动的,如果ai>aj,ai>ak或ai<aj,ai<ak,且j
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define N 30010
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int T,i,j,k,l,n,m,a[N],ans,p;
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
p=0;
ans=1;
fo(i,1,n) scanf("%d",&a[i]);
fo(i,1,n-1)
if (p==0)
{
if (a[i+1]<a[i])
{
ans++;
p=1;
}
}else
if (p==1)
{
if (a[i+1]>a[i])
{
ans++;
p=0;
}
}
printf("%d\n",ans);
}
}
——2016.7.14