【wikioi1006】等差数列

1006 等差数列

题目描述 Description

给定n(1<=n<=100)个数,从中找出尽可能多的数使得他们能够组成一个等差数列.求最长的等差数列的长度.

输入描述 Input Description

第一行是一个整数n,接下来一行包括了n个数,每个数的绝对值不超过10000000.

输出描述 Output Description

对于每个输入数据,输出你所找出的最长等差数列的长度

样例输入 Sample Input

7

3

8

4

5

6

2

2

样例输出 Sample Output

5

思路 thinkings

我似乎想了太多。。排序然后乱搞。。。100数据范围居然搞了一中午,我好弱啊

代码codes

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
    int a[105];
    int n,large;
    cin>>n;
    large=0;
    for (int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    if ((a[1]==a[n])) {cout<<n<<endl; return 0;}
    for (int i=1;i<=n;i++)
    {
        for (int j=i+1;j<=n;j++)
        {
            int now=j;
            int ans=2;
            int gc=a[j]-a[i];
            for (int k=j+1;k<=n;k++)
            {
                if ( (a[k]-a[now])==gc )
                {
                    ans=ans+1;
                    now=k;
                }
                if(a[k]-gc>a[now]) break;
            }
            large=max(large,ans);
        }
    }
    cout<<large<<endl;
    return 0;
}

结果results

.

时间: 2024-08-25 20:30:26

【wikioi1006】等差数列的相关文章

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,