上次有人问了一个题目,是NOIP以前的一个试题, 是关于枚举的。题目如下:
等差数列(aseq)
【问题描述】
给定n(1<=n<=5000)个数,从中找出尽可能多的数使得他们能够组成一个等差数列.求最长的等差数列的长度.
【输入数据】
第一行是一个整数n,接下来一行包括了n个数,每个数的绝对值不超过10000000.
【输出数据】
对于每个输入数据,输出你所找出的最长等差数列的长度
输入样例
Aseq.in
7
3
8
4
5
6
2
2
输出样例
Asep.out
5
一开始的时候,没有看清楚题目,感觉怪怪的,觉得目测题目中的范例,长度不应该是5。后来又认真的看了一下,才发现输入数据下面的描述,是说第一行指定了数组的长度。
题目本身到没有什么,就是先排序,然后判断最大长度。回头整理一下,把代码贴上。
补上代码, pascal的,为了方便,就没有输出到文件,而且打印了一些过程信息。(前一段时间在网上找了一下,一般都没有贴上代码)
type arr = array[1..5000] of longint;
var
a : arr;
n, i, j, k, len, max, diff : longint;
procedure qsort(pos_l, pos_r : longint);
var
i , j, key, tmp, pos : longint;
begin
if (pos_l < pos_r) then
begin
i := pos_l - 1;
j := pos_r + 1;
key := a[pos_l];
//writeln('---- In qsort. L is: ', pos_l, ' R is: ', pos_r, ' key is: ', key);
while true do
begin
repeat i := i + 1; until a[i] >= key;
repeat j := j - 1; until a[j] <= key;
if (i < j) then
begin
tmp := a[i]; a[i] := a[j]; a[j] := tmp;
end // end of swap.
else
break;
end; // end while loop;
pos := j;
qsort(pos_l, pos);
qsort(pos + 1, pos_r);
end; // end (i < j) checking.
end;
begin
assign(input,'aseq.in');
// assign(output,'aseq.out');
reset(input);
// rewrite(output);
// 1. Get the array size from the file.
readln(n);
writeln('========================');
writeln('The arrary size is: ', n);
// 2. Setup the array.
for i := 1 to n do readln(a[i]);
for i := 1 to n do
write(a[i], ' ');
writeln();
// 3. Sort the array.
qsort(1, n);
writeln('========================');
for i := 1 to n do
write(a[i], ' ');
writeln();
// 4. Get the max length.
max := 0;
for i := 1 to n-1 do
for j := i+1 to n do
begin
diff := a[j] - a[i];
len := 2; // the init length is 2 because we got two number to compare while start the checking.
for k := j+1 to n do
begin
if ((a[k] - a[k-1]) = diff) then
len := len + 1
else
break;
end;
if (len > max) then
max := len;
end; // end of the two loops.
writeln('======= The max length is: ', max);
close(input);
// close(output);
end.