1056 最长等差数列 V2

原创 2017年09月25日 16:41:47

1056 最长等差数列 V2

基准时间限制:8 秒 空间限制:131072 KB

Description

N个不同的正整数,从中选出一些数组成等差数列。

例如:1 3 5 6 8 9 10 12 13 14

等差子数列包括(仅包括两项的不列举)

1 3 5

1 5 9 13

3 6 9 12

3 8 13

5 9 13

6 8 10 12 14

其中6 8 10 12 14最长,长度为5。

现在给出N个数,你来从中找出一个长度 >= 200 的等差数列,如果没有,输出No Solution,如果存在多个,输出最长的那个的长度。

Input

第1行:N,N为正整数的数量(1000 <= N <= 50000)。

第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)

(注,真实数据中N >= 1000,输入范例并不符合这个条件,只是一个输入格式的描述)

Output

找出一个长度 >= 200 的等差数列,如果没有,输出No Solution,如果存在多个,输出最长的那个的长度。

Input示例

10
1
3
5
6
8
9
10
12
13
14

Output示例

No Solution

Solution

显然这道题不能用常规方法n^3,虽说时间复杂度有8s,但n^3还是会炸,首先,通过枚举两个数确定公差是必须的,所以说n^2一定存在,而对于判断这个数列的长度,则可以采取hash的玄学优化,虽然看似这样还是n^3的,不过却可以跑得飞快(当然你也可以加个排序来剪枝)
#include<cstdio>
#include<algorithm>
#include<cmath>
#define inf 1000000000
#define Mod 10000000
using namespace std;
int mx,mn,ans=0,n;
int x[50010],hash[Mod];
int read(){
    int ans=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')ans=ans*10+ch-'0',ch=getchar();
    return ans;
}
int calc(int x){
    int now=x%Mod;
    if (!now) now+=Mod;
    while (hash[now]!=0 && hash[now]!=x) now=now%Mod+1;
    return now;
}
bool find(int x){
    if (hash[calc(x)]==x) return 1;
    return 0;
}
int main(){
    mx=0,mn=inf;
    n=read();
    for (int i=1;i<=n;i++){
        x[i]=read();
        if (x[i]>mx) mx=x[i];
        if (x[i]<mn) mn=x[i];
    }
    ans=199;
    sort(x+1,x+n+1);
    x[0]=x[1]-1;
    for (int i=1;i<=n;i++)
        hash[calc(x[i])]=x[i];
    for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++){
            int y=x[j]-x[i],k=x[j],len=2;;
            if ((long long)x[i]+ans*y>mx || (long long)x[i]+ans*y<mn) break;
            while (1){
                if (!find(k+y)) break;
                k+=y;
                len++;
            }
            if (len>ans) ans=len;
        }
    if (ans<200) printf("No Solution"); else printf("%d\n",ans);
    return 0;
}

51nod 1055最长等差数列 dp

N个不同的正整数,找出由这些数组成的最长的等差数列。 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9...
  • liuyanfeier
  • liuyanfeier
  • 2016年02月28日 16:55
  • 1341

动态规划-数组中求最长等差数列的长度

题目:给定一个数组求出数组最长等差数列的长度。 举例:3,8,4,5,6,2 输出:5。 思路:利用区间dp来做,dp[i][diff]的意思是 intAr[0]到intAr[i],等差为dif...
  • li563868273
  • li563868273
  • 2016年04月24日 19:28
  • 1394

待字闺中之最长等差数列分析

原题 给定未排序的数组,请给出方法找到最长的等差数列。 分析 题目描述比较简单,但是有一个问题我们需要首先搞清楚:等差数列中的数字,是否要和原始数组中的顺序一致。题目中,并没有说明,...
  • fangjian1204
  • fangjian1204
  • 2014年09月06日 08:44
  • 1041

51nod 1056 最长等差数列 V2

题目大意N个不同的正整数,从中选出一些数组成等差数列。 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 1...
  • ypxrain
  • ypxrain
  • 2017年04月14日 09:27
  • 260

51nod1055: 最长等差数列(dp)

1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 N个不同的正整数,找出由...
  • junior19
  • junior19
  • 2017年03月09日 22:52
  • 132

算法题32 从随机数数组中选取长度不小于3的最长等差数列

题目:求随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0]. 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5] ...
  • wcyoot
  • wcyoot
  • 2011年05月22日 04:10
  • 3769

微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列

求微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出[-1,1...
  • cwqbuptcwqbupt
  • cwqbuptcwqbupt
  • 2012年05月08日 16:43
  • 3959

51Nod-1055-最长等差数列

ACM模版描述题解这道题虽然过了,但是不得不说是打了内存的擦边球,因为前所未有的使用了short int类型,不然就爆内存了,这也是很措手不及。这道题的坑不止这一点,题目说,从这N个数中找出若干数组成...
  • f_zyj
  • f_zyj
  • 2016年10月14日 00:59
  • 476

找最长等差数列的长度

找最长等差数列的长度
  • guozhenqiang19921021
  • guozhenqiang19921021
  • 2016年04月23日 23:29
  • 701

每日微软面试题——day 4 (最长等差数列)

题:求随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出...
  • zhanxinhang
  • zhanxinhang
  • 2011年08月08日 00:18
  • 16670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1056 最长等差数列 V2
举报原因:
原因补充:

(最多只允许输入30个字)