波动序列解题报告

来源:互联网 发布:杭州php招聘 编辑:程序博客网 时间:2024/04/30 00:58

描述:有一个长度为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。后来才知道不要求连续,这样问题就简单了好多,从头一个个比较就好了。

原创粉丝点击