Nickolay.info. Алгоритмы. Самая длинная последовательность нулей

Найти самую длинную последовательность из нулей в массиве 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.

Рейтинг@Mail.ru

вверх гостевая; E-mail