CODE[VS] 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

数据范围及提示 Data Size & Hint


刚看这个题觉得可以用dp来做,但是考虑到当前状态存储的话,需要两个量,即长度和等差数列的差,所以不好做就不尝试这种方案了,所以就往简单处想,直接循环判断i和比i大的j这个状态时的等差数列长度,然后进行与max的比较即可.
当然,前提是有序的,所以我们首先选择进行快排

/*************************************************************************
    > File Name: 等差数列.c
    > Author: zhanghaoran
    > Mail: chilumanxi@gmail.com
    > Created Time: 2015年06月09日 星期二 18时19分07秒
 ************************************************************************/

#include <stdio.h>
#include <string.h>

int n;
int dp[101];

void swap(int *a, int *b){
	int *t = a;
	a = b;
	b = t;
}

void quicksort(int a[], int left, int right){
	int i, j, s, t;
	if(left < right){
		s = a[right];
		i = left - 1;
		for(j = left; j < right; j ++){
			if(a[j] <= s){
				t = a[++i];
				a[i] = a[j];
				a[j] = t;
			}
		}
		t = a[right];
		a[right] = a[i + 1];
		a[i + 1] = t;
		quicksort(a, left, i);
		quicksort(a, i + 2, right);
	}
}
int solve(int a[]){
	int i, j;
	int max = 0, res = 0;
	int temp;
	int t, s;
	for(i = 0; i < n - 1; i ++){
		for(j = i + 1; j < n; j ++){
			temp = a[j] - a[i];
			t = j;
			s = i;
			while(t < n){
				if(a[t] - a[s] == temp){
					s = t;
					t ++;
					res ++;
				}
				else t ++;
			}
			max = max > res ? max : res;
			res = 0;
		}
	}
	return max;
}


int main(void){
	int i, j;
	int a[101];
	scanf("%d", &n);
	for(i = 0; i < n; i ++){
		scanf("%d", &a[i]);
	}
	quicksort(a, 0, n - 1);
	printf("%d\n", solve(a) + 1);
	return 0;
}


posted @ 2015-06-09 19:12  ChiLuManXi  阅读(462)  评论(0编辑  收藏  举报