zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    UI自动化实现多浏览器运行
    【转】C#操作XML方法集合
    日拱一卒
    敏捷开发- planning会议中的开会趣事
    敏捷开发- 可行走的骨骼
    敏捷开发- 测试人员何去何从
    Nunit & Specflow
    [转]根本原因分析(Root Cause Analysis)
    Selenium 中抓取dropdown
    网页模板
  • 原文地址:https://www.cnblogs.com/qq-star/p/4693709.html
Copyright © 2011-2022 走看看