NOIP -- 以往试题: 等差数列

上次有人问了一个题目,是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.

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值