输入t
后,开始我们的推理。
1.首先我们可以定义一个整型变量c
,初始值为0,设一个while
循环(for
循环也行),将c
+1。
......
int c=0;
while(t--)
{
c++;//c是后面输出的组别编号。
......
}
2.然后定义并输入N
,以及定义数组a[N]
和b[N]
。
int N;
cin>>N;
int a[N]={},b[N]={};//b[N]记录每个子序列的长度。
3.定义for
循环,输入a[i]
,把b[i]
的值设为2。因为我们知道,最短的子序列长度为2。
for(int i=0;i<N;i++)
{
cin>>a[i];
b[i]=2;
}
4.定义一个下标r1
,初始值为0。
......
int r1=0;
......
5.接着就是这一题的重点了,敲黑板划重点了哈:
for(int i=2;i<N;i++)//定义for循环,i的值为2。
{
if(a[i-2]-a[i-1]==a[i-1]-a[i])b[r1]++;
/*
这两行代码一定要看懂,它判断前两个数与前一个数的差是否等于前一个数和当前数(a[i])的差。
如果是,那么子序列的长度就加一。如果不是,则当前数不属于当前子序列,下标加1。
*/
else r1++;
}
6.然后对b[N]
进行排序。
sort(b,b+1+r1);
7.最后按格式输出b[r1]
就行啦~
程序如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,c=0;
cin>>t;
while(t--)
{
c++;
int N;
cin>>N;
int a[N]={},b[N]={};
for(int i=0;i<N;i++)
{
cin>>a[i];
b[i]=2;
}
int r1=0;
for(int i=2;i<N;i++)
{
if(a[i-2]-a[i-1]==a[i-1]-a[i])b[r1]++;
else r1++;
}
sort(b,b+1+r1);
printf("Case #%d: %d\n",c,b[r1]);
}
}