• 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);
        ......
  • 相关阅读:
    database使用
    画图工具
    宝塔面板权限不足问题解决
    nginx查看并发数量
    台式机未插入扬声器或者耳机
    键盘出现乱码解决
    lnmp宝塔面板问题
    nginx+mysql双主搭建
    zabbix客户端安装
    java生产条形码
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5271912.html
Copyright © 2020-2023  润新知