hdu 5328 Problem Killer(杭电多校赛第四场)

题目链接: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
",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 }
原文地址:https://www.cnblogs.com/qq-star/p/4693709.html