题意:
意思是给出你一个数组,判断里面最长的一个区间,区间里的数要么为等比数列,要么为等差数列,也可以两个都是。
解析:
从前往后扫,分别用两个数来记录等差数列的差值和等比数列的比值,不断比较前面一个和后面一个的差值和比值,如果不相等,维护区间长度和差值或比值。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
const int INF = 0x3f3f3f3f;
double A[N];
double d, q;
int n;
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%lf", &A[i]);
}
if(n == 1) {
puts("1");
continue;
}
if(n == 2) {
puts("2");
continue;
}
A[0] = -INF;
int maxa = 2, maxg = 2;
int lena = 2, leng = 2;
d = A[2] - A[1];
q = A[2] / A[1];
for(int i = 3; i <= n; i++) {
if(A[i] - A[i-1] == d) {
maxa = max(maxa, ++lena);
}else {
d = A[i] - A[i-1];
lena = 2;
}
if(A[i] / A[i-1] == q) {
maxg = max(maxg, ++leng);
}else {
q = A[i]/A[i-1];
leng = 2;
}
}
printf("%d\n", max(maxa, maxg));
}
return 0;
}