Pers.narod.ru. Алгоритмы. Самая длинная последовательность нулей |
Найти самую длинную последовательность из нулей в массиве A(i),i=1,2,..,N.
Единственный алгоритмически важный момент в подобных задачах - по возможности сократить число просмотров массива. Поскольку в данном случае у программы всего два состояния - внутри очередной цепочки нулей и вне её, то всё можно сделать за один проход по массиву.
program Nulls;
uses crt;
const size=1000; {Максимальный размер массива}
var a:array [1..size] of integer; {Массив}
n,len,maxlen,i:integer;
{реальная размерность,длина последовательности,
макс.длина,счетчик}
in0:boolean; {Признак того, что мы внутри последовательности нулей}
begin
ClrScr; {Очистили экран}
repeat
Writeln;
Write ('Введите размерность массива (от 2 до ',size, '):');
Readln (n);
until (n>1) and (n<=size); {Ввод правильной размерности}
writeln ('Генерирую массив из ',n,' элементов...');
delay (500); {Задержка полсекунды}
for i:=1 to n do a[i]:=Random(2); {Random(2) вернет 0 или 1}
writeln ('Считаю длину последовательности...');
delay (500);
len:=0; maxlen:=0; in0:=false;
for i:=1 to n do begin
if (a[i]=0) then begin {Нашли нулевой элемент}
if (in0) then begin {Если внутри последовательности}
len:=len+1; {то увеличить на 1 ее длину}
if len>maxlen then maxlen:=len; {и сравнить с максимальной длиной}
end
else begin {иначе}
len:=1; {войти внутрь последовательности}
in0:=true;
end;
end
else begin {Ненулевой элемент}
len:=0; {сбросить длину последовательности}
in0:=false; {сбросить признак того, что мы внутри посл.-сти}
end;
end;
Writeln ('Последовательность чисел:');
for i:=1 to n do write (a[i]:2);
Writeln;
Writeln ('Максимальная длина последовательности нулей=',maxlen);
end.
В случаях, когда нужно найти самую длинную последовательность одинаковых элементов массива независимо от их значений, помочь может такая программа:
{Самая длинная последовательность одинаковых элементов}
{Выводится длина цепочки элементов и значение элемента}
const N=6;
const a:array [1..N] of integer =(
2,1,3,5,4,4
);
var i,len,maxlen,pos:integer;
begin
{Поиск самой длинной цепочки}
len:=1;
maxlen:=0;
for i:=1 to n-1 do
if a[i]=a[i+1] then begin
inc (len);
if len>maxlen then begin pos:=i; maxlen:=len; end;
end
else len:=1;
writeln (' maxlen=',maxlen);
writeln (' item=',a[pos]);
reset(input); readln;
end.
|
|