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

来源:互联网 发布:js验证提示信息 编辑:程序博客网 时间:2024/05/21 02:33
题目链接: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 }

 

0 0
原创粉丝点击