描述:有一个长度为N 的整数序列,序列里面的数是两两不同的,现在要在里面
找一个波动序列,这个序列越长越好。
比如有波动序列{a0,a1,a2…an},则a0 > a1 < a2 > a3 <…
输入输出要求:
Input
第一行输入一个数T,代表有T 个任务,T 不大于50。
对于每个任务,输入格式为
N a0 a1 a2 … aN
其中N<=30000,测试数据保证序列的数两两不同。
Output
对于每个任务,输出最长的波动序列长度
输入输出样例:
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
解题思路:由题得,波动序列第一个数必须比第二个数大,所以先找到第一个比它后一个数大的数的下标,然后从这个数往后一个个比较,用一个标记变量flag记录状态,flag为0时,后一个数要比前一个数小,flag为1时,后一个数要比前一个数大。每满足一次条件,answer便自加一,最后输出结果。
代码:
#include<stdio.h>
int num[30005];
int main()
{
intT;
scanf("%d",&T);
while(T--)
{
intN;
inti;
intpos=0;
intflag=0;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&num[i]);
intcount=1;
for(i=1;i<N;i++)
if(num[i]<num[i-1])
{
pos=i-1;
break;
}
for(i=pos;i<N-1;i++)
{
if(((flag==0)&&(num[i+1]<num[i]))||((flag==1)&&(num[i+1]>num[i])))
{
count++;
flag=(flag+1)%2;
}
}
printf("%d\n",count);
}
return0;
}
解题感想:再次被测试样例坑了,一直以为波动序列要连续才可以,断掉了就要重新记录。从测试样例根本看不出波动序列是不是连续的,而我一直当成要连续,所以样例过了,但是一直WA。后来才知道不要求连续,这样问题就简单了好多,从头一个个比较就好了。