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 }
  • 相关阅读:
    `cd -`
    .git文件夹过大的解决方法
    避免对函数参数的修改
    2020年10月 修改Ant Design Pro底部版权信息的方法
    度目-人脸应用套件 文档中的坑
    "A little like that j-thing"
    Linux安装MySQL后设置密码
    append对len和cap的影响
    s := []int{0, 1, 2, 3, 8: 100}
    Python学习笔记
  • 原文地址:https://www.cnblogs.com/qq-star/p/4693709.html
Copyright © 2011-2022 走看看