题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328
题目大意:找到连续的最长的等差数列or等比数列。
解题思路:1、等差等比的性质有很多。其中比较重要的一个就是解题关键:如a[i-2],a[i-1],a[i],a[i+1]这个序列。a[i-2],a[i-1],a[i]是等差数列,a[i-1],a[i],a[i+1]也是等差数列。那么a[i-2],a[i-1],a[i],a[i+1]就是等差数列。
2、 等比数列也是一样的~~只要根据这个性质就可以把整个序列查抄一遍,时间复杂度达到O(n);
3、还有一个就是如果是等差数列就满足2*a[i-1]=a[i]+a[i-2];等比的话满足a[i-1]*a[i-1]=a[i]*a[i-2]。
详见代码。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 5 using namespace std; 6 7 int ans,n; 8 long long a[1000010]; 9 10 void Find() 11 { 12 int i; 13 //cout<<ans<<endl; 14 int l=1; 15 for (i=3; i<=n; i++) 16 { 17 if (a[i-1]*2!=a[i-2]+a[i]) 18 l=i-1; 19 ans=max(ans,i-l+1); 20 } 21 l=1; 22 23 for (i=3; i<=n; i++) 24 { 25 long long L=a[i-1]*a[i-1]; 26 long long R=a[i]*a[i-2]; 27 //cout<<L<<" "<<R<<endl; 28 if (L!=R) 29 l=i-1; 30 ans=max(ans,i-l+1); 31 } 32 printf ("%d\n",ans); 33 } 34 35 int main() 36 { 37 int t; 38 scanf("%d",&t); 39 while (t--) 40 { 41 scanf("%d",&n); 42 for (int i=1; i<=n; i++) 43 { 44 scanf("%lld",&a[i]); 45 } 46 ans=min(n,2); 47 Find(); 48 } 49 return 0; 50 }
时间: 2024-11-07 17:39:58