Условие: Дана вещественная таблица a[1], a[2],...,a[1000]. Определить максимальное количество подряд идущих положительных элементов последовательности, не прерываемых ни нулями, ни отрицательными элементами. Напечатать найденный фрагмент.
Технические условия: Стандартные.
Примеры входных и выходных файлов: Отсутствуют.
Решение: Идея решения. Движемся вдоль массива. Фиксируем начало и конец "положительного” фрагмента и запоминаем его длину, индексы первого и последнего элементов. Аналогично поступаем со следующим фрагментом ( если он есть!). Если следующий фрагмент длиннее предыдщего, то помним его начало, конец и длину. Так ( за один проход!) проходим по всему массиву и на финише имеем то, что позволит нам напечатать интересующий нас фрагмент. Комментарии в исходнм тексте позволят до конца уяснить решение.
const max = 100; {сколько элементов в массиве} var a:array[1..max] of integer; {исследуемый массив} maxstart,maxstop,i,len,start,stop:integer; begin randomize; {заполняем массив случайными числами } for i:=1 to max do begin a[i]:=random(5); a[i]:=a[i]-1; {чтобы были числа меньше 0} write(a[i],' '); end; i:=1; maxstart:=0; {начало искомого фрагмента} maxstop:=0; {конец искомого фрагмента} len:=0; {текущая длина фрагмента} while i<=max do begin while (i<=max) and (a[i]<=0) do {ищем начало фрагмента...} inc(i); start:=i; {запоминаем начало фрагмента} while (i<=max) and (a[i]>0) do {ищем конец фрагмента} inc(i); stop:=i-1; {запоминаем конец фрагмента} if len<stop-start then begin {текущий фрагмент длиннее всех предыдущих} len:=stop-start; maxstart:=start; maxstop:=stop; end; end; writeln; if maxstop=0 then writeln('Нет положительных элементов') else begin writeln('Найденa последовательность от ',maxstart,' до ',maxstop); for i:=maxstart to maxstop do begin write(a[i],' '); end; end; end.