题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328
题意:给出一个序列,要求截取一段最长的等比或者等差数列
思路:暴力预处理相邻的数的ap和gp,注意gp要用小数,遍历取最大就可以
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
double gp[1000030];
int ap[1000030],s[1000030];
int main()
{
int t,n;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d",&s[i]);
for (int i=1;i<n;i++)
{
ap[i]=s[i]-s[i-1];
gp[i]=1.0*s[i]/s[i-1];
}
int res=1,now=ap[1],tmp=1;
for (int i=2;i<n;i++)
{
if (ap[i]==now)
{
tmp++;
}
else
{
res=max(res,tmp);
tmp=1;
now=ap[i];
}
}
res=max(res,tmp);
double now2=gp[1];
tmp=1;
for (int i=2;i<n;i++)
{
if (gp[i]==now2)
{
tmp++;
}
else
{
res=max(res,tmp);
tmp=1;
now2=gp[i];
}
}
res=max(res,tmp);
if (n!=1) res++;
printf("%d\n",res);
}
}