zoukankan      html  css  js  c++  java
  • zoj2527_求最长等差数列

    /*
    *题目大意:
    *        给定一个长度最多为1000的序列,其中数的范围为-1000000000到1000000000,然后
    *        求其中最长的等差数列(可以乱序);
    *解题思路:
    *        先对序列排序,方便后面的处理,减少复杂度。然后枚举这个序列,再枚举可能的公差,
    *        然后再用红黑树之类的具有O(logn)性质的数据结构检查出满足的等差数列。以这样的方式
    *        去求肯定会TLE的。最后还要分析:因为等差数列,其实当一串序列的最长等差数列为2,而
    *        数又不大于1000000000,这样的序列最多也才30个左右,而题目给定的长度为1000,这就证明
    *        会有很多子问题。所以,只需要以公差为记录,开一个标志数组来标志去重即可。
    */
    View Code
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <functional>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include <utility>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <bitset>
    #include <iomanip>
    #include <sstream>
    
    #define abs(x) ((x)>0?(x):-(x))
    #define sqr(x) ((x)*(x))
    
    #define all(x) x.begin(), x.end()
    #define rall(v) v.rbegin(),v.rend()
    
    #define ll long long
    #define ull unsigned long long
    
    #define FOR(i,a,b)        for(int i=(a); i<(b);i++)
    #define FF(i,a)            for(int i=0; i<(a);i++)
    #define FFD(i,a)        for(int i=(a)-1; i>=0;i--)
    #define CC(m,what)        memset(m,what,sizeof(m))
    #define SZ(a)            ((int)a.size())
    #define viewPP(a,n,m)    {puts("---");FF(i,n){FF(j,m) cout<<a[i][j] <<' ';puts("");}}
    #define viewP(a, n)     {FF(i, n) {cout<<a[i]<<" ";} puts("");}
    
    #define read            freopen("in.txt","r",stdin)
    #define write            freopen("out.txt","w",stdout)
    
    const double eps = 1e-11;
    const int inf = 0x7fffffff;
    const int hinf = 0x3f3f3f3f;
    const double pi = 3.1415926535897932;
    
    int dx[] = {-1, 0, 1, 0};//up Right down Left
    int dy[] = {0,  1, 0, -1};
    
    using namespace std;
    const int maxn = 1005;
    
    int arr[maxn];
    map<int, int> vst;
    multimap<int, int> num;
    
    int main(void) {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
    #endif
    
        int n;
        while(scanf("%d", &n) == 1) {
            num.clear(), vst.clear();
            for(int i = 0; i < n; i++) {
                scanf("%d", &arr[i]);
                num.insert(make_pair(arr[i], 1));
            }
            
            sort(arr, arr+n);
            int Max = -inf;
            FF(i, n) {
                for(int j = i+1; j < n; j++) {
                    int cut = arr[j] - arr[i];
                    int ct = 2;
                    if(!cut)
                        continue;
                    if(vst.count(cut) != 0 && vst[cut] >= arr[j]) {
                        continue;
                    }
                    else {
                        int nxt = arr[j];
                        while(1) {
                            nxt += cut;
                            if(num.find(nxt) != num.end())
                                ct++;
                            else break;
                        };
                        vst[cut] = nxt-cut;
                        if(ct > Max) Max = ct;
                    }
                }
            }
            FF(i, n) {
                int ct = num.count(arr[i]);
                //cout << arr[i] << " " << ct << endl;
                if(ct > Max)
                    Max = ct;
            }
            printf("%d\n", Max);
        }
        return 0;
    }
  • 相关阅读:
    http缓存
    深入理解vertical-align
    WebSocket
    mongodb 语法小结
    鸡肋工具-Oracle建表工具
    Ajax 实现导出文件-支持批量
    Springboot 热部署
    RabbitMq(7)消息延时推送
    linux常用符号命令
    linux常用命令之文档
  • 原文地址:https://www.cnblogs.com/cchun/p/3026854.html
Copyright © 2011-2022 走看看