Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Длиннейшая последовательность

Автор: Kolyancz 5.11.2008 18:33

Задана последовательность чисел N. N<=1000. Найдите длину длиннейшей возрастающей последовательности, входящей в эту последовательность.
Например:
Дана последовательность: 4 6 1 6 9 9 6 1 2
Ответ: 3 (потому что самый длинный участок - это 1 6 9)

Порядок ввода данных: сначала задается кол-во чисел в последовательности, потом числа этой последовательности.
Например:
Ввод:
9
4 6 1 6 9 9 6 1 2
Вывод:
3

Автор: volvo 5.11.2008 18:49

http://volvo71.narod.ru/faq_folder/matrices.htm#arr_asc

Элементарно преобразуется к варианту без использования массива... Попробуй сам, что получится - показывай...

Автор: Kolyancz 1.12.2008 3:23

Получилось вот что:

Код

type TType = integer;
var
         n:integer;
  a: array[1 .. 1000] of integer;

function find_ascend(var arr: array of ttype;
         const n: integer; var max: integer): integer;

  var curr, start: integer;

  function check_max(i: integer): integer;
    begin
      if max < curr then
        begin
          max := curr;
          check_max := i - curr + byte(i = pred(n))
        end
      else check_max := start
    end;

  var
    i: integer;

  begin
    max := 0; curr := 1;
    start := 1;

    for i := 1 to pred(n) do
      begin
        if arr[i - 1] < arr[i] then
          inc(curr)
        else
          begin
            start := check_max(i);
            curr := 1
          end;
      end;
    start := check_max(i);
    find_ascend := start
end;


var i,_start, _max: integer;
begin
readln(n);
for i:=1 to n do
readln (a[i]);
writeln(a:n);
  _start := find_ascend(a, n, _max);
  writeln(_max) ;

end.


Счетает все отлично, вот только есть одна загвоздка. Нужно сделать ввод чисел через пробел, а не enterом. Вопрос, как?

Автор: volvo 1.12.2008 3:35

Цитата
Вопрос, как?
Использовать функцию EOLn, и переписать ввод вот так:
n := 0;
while not eoln do begin
inc(n); read(a[n]);
end;
_start := find_ascend(a, n, _max); { Ну, и вызываешь функцию }
(теперь даже не надо вводить число элементов, оно будет подсчитываться автоматически. Просто вводишь последовательность через пробел, и в конце жмешь Enter...)

Автор: Kolyancz 1.12.2008 4:22

Спасибо, большое, теперь все в порядке.