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\n",r + 1);
    ......
时间: 2024-10-09 00:15:00

code1006 等差数列的相关文章

51nod1055 最长等差数列

基准时间限制:2 秒 空间限制:262144 KB 分值: 80 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. Input 第1行:N,N为正整数的数量(3 <= N <= 10000). 第2 - N+1行:N个正整数.(2<= A[i] &

【HDOJ 4768】 Flyer (等差数列+二分)

[HDOJ 4768] Flyer (等差数列+二分) Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2022    Accepted Submission(s): 743 Problem Description The new semester begins! Different kinds of student soc

51nod1056 最长等差数列 V2

基准时间限制:8 秒 空间限制:131072 KB 分值: 1280 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,如果存在多个,输出最长的那个的长度. I

HDU 5512 Pagodas(等差数列)

题目戳这 题意:给你三个数:n,a,b,一开始一个集合里面有两个数:a和b,然后两个人轮流往这个集合里面增加数字,增加的这个数字的原则是,这个集合里面任选两个数的和或差,集合里面的数字不能重复,同时这个数字不能大于 n .(本来说的造塔,这样说方便一点) 思路:本来还以为是博弈,但是后来把数字的加减都模拟一遍之后发现,无论怎样,最后得到的这个集合里面的数列,其实是一个等差数列,所以这就简单了,由一开得到的 a 和 b 来相减,然后不断地取最小的两个数相减,然后等到等差数列的差,这个差同时也是等差

1055 最长等差数列

1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 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. Input 第1行:N,N为正整数的数量(3 <= N <= 10000). 第2 - N+1行:N个正整数.(2<= A

找最长等差数列的长度

题目描述:给定n(1<=n<=100)个数,从中找出尽可能多的数,使得他们能够组成一个等差数列.求最长的等差数列的长度,每个数的绝对值不超过10000000. 样例: 输入数组为:2,8,3,5,6,4 输出为:5 Java代码实现: 1 import java.util.*; 2 public class Main { 3 public static int maxlength(int a[]){ 4 int n=a.length; 5 int large=0; //记录最大长度 6 Arr

bzoj 4373: 算术天才⑨与等差数列 hash

题目链接 题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来做, 用线段树保存一个区间里的最小值, 和, 以及平方的和. 然后每次询问, 假设这个区间构成等差数列,那么首项为这个区间的最小值, 然后按公式算出以minn为首项, k为公差的数列的和, 为a1*len+len*(len-1)/2*d, 然后算出平方的和, 相当于sigma(i : 0 to le

BZOJ4373: 算术天才⑨与等差数列

Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列.当然,他还会不断修改其中的某一项.为了不被他鄙视,你必须要快速并正确地回答完所有问题.注意:只有一个数的数列也是等差数列. Input 第一行包含两个正整数n,m(1<=n,m<=300000),分别表示序列的长度和操作的次数.第二行包含n个整数,依次表示序列中的每个数a[i

BZOJ 3357: [Usaco2004]等差数列( dp )

dp(x, p) 表示序列中第x个数, 上一个数是p构成的等差数列的最长. 转移时从[1, x)中枚举p = seq[] 就行了.时间复杂度O(n²logn) --------------------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; i++) #define Rep(i,