Найти в массиве длину К самой длинной "пилообразной" (зубьями вверх) последовательности идущих подряд чисел - Free Pascal
Формулировка задачи:
Задан массив X[1..m]. Найти длину К самой длинной "пилообразной"(зубьями вверх) последовательности идущих подряд чисел: X[p+1]<X[p+2]>X[p+3]<....>X[p+K].
Решение задачи: «Найти в массиве длину К самой длинной "пилообразной" (зубьями вверх) последовательности идущих подряд чисел»
textual
Листинг программы
uses crt;
const nmax=20;
var a:array[1..nmax] of integer;
m,p,j,k,mx,pmx,max:byte;
begin
clrscr;
repeat
write('Размер массива до ',nmax,' m=');
readln(m);
until m in [1..nmax];
writeln('Введите элементы массива, в том числе пилообразные участки:');
for p:=1 to m do
begin
write('a[',p,']=');
readln(a[p]);
end;
clrscr;
writeln('Массив:');
for p:=1 to m do
write(a[p],' ');
writeln;
writeln;
p:=2;mx:=0;pmx:=0;max:=0;
while p<m do
if (a[p]>a[p-1])and(a[p]>a[p+1]) then
begin
j:=p;k:=0;
while (a[j]>a[j-1])and(a[j]>a[j+1])and(j<m) do
begin
k:=k+1;
j:=j+2;
end;
if k>mx then
begin
max:=2*k+1;
pmx:=p-1;
end;
p:=p+2*k+1;
end
else p:=p+1;
if max=0 then write('Нет пилообразных участков!')
else
begin
writeln('Максимальная пилообразная последовательность=',max);
for p:=pmx to pmx+max-1 do
write(a[p],' ');
end;
readln
end.
Объяснение кода листинга программы
- Вводится размер массива
nmaxи сохраняется в константеnmax. - Создается массив
aтипаarray[1..nmax] of integerдля хранения чисел. - Создаются следующие переменные:
mдля хранения размера массива;pдля счётчика элементов массива;jиkдля работы с пилообразными участками;mxдля хранения максимальной длины пилообразного участка;pmxдля хранения индекса начала пилообразного участка;maxдля хранения максимального размера пилообразного участка.
- Пользователю предлагается ввести элементы массива.
- После ввода всех элементов, программа ищет пилообразные участки, сравнивая три элемента в ряд.
- Если текущий элемент больше предыдущего и следующего, начинается новый пилообразный участок.
- Длина текущего пилообразного участка сохраняется в переменной
k. - Если текущий пилообразный участок длиннее предыдущего, текущий пилообразный участок заменяет предыдущий, а его длина сохраняется в переменной
mx. - Индекс начала текущего пилообразного участка сохраняется в переменной
pmx. - После окончания ввода, программа выводит массив.
- Если максимальный пилообразный участок не найден, выводится сообщение
Нет пилообразных участков!. - В противном случае выводится сообщение
Максимальная пилообразная последовательность=, за которым следуют элементы пилообразного участка, а затем запрашивается ввод.