Урок 15. Задача 18.

Урок 15. Задача 18.

Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.

type ArrOfInt = array [1..100] of integer;
var k, N :integer;
    Arr :ArrOfInt;

function random_array() :ArrOfInt; // создаем массив
var i :integer;
    Arr :ArrOfInt;
begin
  randomize;
  for i := 1 to 100 do
    Arr[i] := random(9);
  random_array := Arr;
end;

function segment_in(k :integer; Arr :ArrOfInt) :boolean; // ищем отрезок
var i, j :integer;
    fl :boolean;
begin
  for i := 0 to k do // отрезок
  begin
    fl := false;
    for j:= low(Arr) to high(Arr) do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  segment_in := fl;
end;

function search_seg(k, m, p :integer; Arr :ArrOfInt) :boolean; // ищем самый короткий отрезок
var i, j :integer;
    fl :boolean;
begin
  for i := 0 to k do
  begin
    fl := false;
    for j:= m to p do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  search_seg := fl;

end;

function search_short(k :integer; Arr :ArrOfInt) :integer; // нарезаем отрезки
var i, m, p :integer;

begin
  for i := k + 1 to high(Arr) do
  begin
    for m := 1 to high(Arr) - i do
    begin
      p := m + i - 1;
      if search_seg(k, m, p, Arr) then
        break;
    end;
    if search_seg(k, m, p, Arr) then
      break;
  end;
  search_short := i;
end;

begin
  Arr := random_array();
  k := 4;
  if segment_in(k, Arr) then
    N := search_short(k, Arr);
  write('Самый короткий отрезок = ', N);
  readln();
end.  
vedro-compota's picture

сначала решим 17-ю

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

добавить альтернативное решение на основе функции num_in()

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

1)

 k := 4;

-- почему именно 4? за что отвечает эта переменная.

Прокомментировать крактко ключевые моменты

2) за что отвечает segment_in()

_____________
матфак вгу и остальная классика =)

type ArrOfInt = array [1..100] of integer;
var k, N :integer;
    Arr :ArrOfInt;

function random_array() :ArrOfInt; // создаем массив
var i :integer;
    Arr :ArrOfInt;
begin
  randomize;
  for i := 1 to 100 do
    Arr[i] := random(9);
  random_array := Arr;
end;

{ ищет вхождение чисел от 0 до k в массиве
  если числа найдены переходим к поиску отрезка
}
function segment_in(k :integer; Arr :ArrOfInt) :boolean; // ищем числа
var i, j :integer;
    fl :boolean;
begin
  for i := 0 to k do // отрезок
  begin
    fl := false;
    for j:= low(Arr) to high(Arr) do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  segment_in := fl;
end;

// ищет отрезок по переданным координатам
function search_seg(k, m, p :integer; Arr :ArrOfInt) :boolean;
var i, j :integer;
    fl :boolean;
begin
  for i := 0 to k do
  begin
    fl := false;
    for j:= m to p do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  search_seg := fl;

end;

// ищет отрезок начиная с меньшего по длине
function search_short(k :integer; Arr :ArrOfInt) :integer; // нарезаем отрезки
var i, m, p :integer;

begin
  for i := k + 1 to high(Arr) do
  begin
    for m := 1 to high(Arr) - i do
    begin
      p := m + i - 1;
      if search_seg(k, m, p, Arr) then
        break;
    end;
    if search_seg(k, m, p, Arr) then
      break;
  end;
  search_short := i;
end;

begin
  Arr := random_array();

  k := 4; // числа участвующие в поиске от 0 до k
  if segment_in(k, Arr) then // ищет отрезок в массиве из чисел от 0 до k
    N := search_short(k, Arr); // ищет отрезок начиная с меньшего по длине
  write('Самый короткий отрезок = ', N);
  readln();
end. 
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)