Форум «Всё о Паскале» _ Задачи _ Длиннейшая последовательность
Автор: 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
Элементарно преобразуется к варианту без использования массива... Попробуй сам, что получится - показывай...
Автор: 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...)