code1006 等差数列

我绞尽脑汁想一个更好的算法,然而不能如愿,只好写一个n^3的了

很简单,就是暴力搜索(还好n<100)

先排序,然后循环i=1ton,j=i+1ton

把a[i]a[j]确定为等差数列开始的两个数,确定公差,然后用search()搜这个数列的长度

取所有的最大值即可

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> 
#define Size 105
using namespace std;

int a[Size];
int N;

int search(int p,int d){//参数:开始位置,公差。
    int num=a[p]+d;
    int cnt=0;

    for(p+=1;p<=N;p++){
        if(a[p]==num){
            cnt++;
            num+=d;
        }
    }
    return cnt;
}

int main(){
    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>a[i];
    }
    
    sort(a+1,a+N+1);
    
    /*for(int i=1;i<=N;i++){
        cout<<a[i];
    }
    cout<<endl;*/
    
    int ans=1;
    for(int i=1;i<=N;i++){
        for(int j=i+1;j<=N;j++){
            int d=a[j]-a[i];
            ans=max(ans,search(j,d)+2);//注意+2,把a[i]a[j]算进去。(search()的结果是不包含这两个的)
        }
    } 
    
    cout<<ans;
    
    return 0;
} 
另外在codevs的题解中看到了几个n^2的,发现好像不太对,如下:(竟然能过了...)

  不明白是什么意思,不过可以找出反例:
  4
  1 3 7 9
  答案应该是2
  但是它的结果是3

    ......
    sort(num + 1, num + N + 1);
    int i,j,k;
    for(i = 1; i <= N; i++)
    {
        for(j = i+1; j <= N; j++)
        {
            if(num[j] >= num[i])
                cha[num[j] - num[i]] ++;
        }
    }
    int r = 0;
    for(i = 0; i <= 10000001; i++)
        r = max(r, cha[i]);
    printf("%d
",r + 1);
    ......
原文地址:https://www.cnblogs.com/FuTaimeng/p/5271912.html