Урок 15, Задача 20

Урок 15, Задача 20

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

type
  arr1 = array [1..20] of integer;

var
 mincount, min, max, i,
    q // верхняя граница поиска чисел от 0 до q
     : integer;
  a : arr1;


function Shortest(q : integer; a : arr1; var mincount : integer) : boolean;
var
  n, k, j, l, count : integer;
  vse: boolean;
begin
  result := false;
  l := 1;
  while l < high(a) - q do
  begin
    count := 0;
    n := 100;
    k := 0;
    for i := 0 to q do
    begin
      vse := false;
      for j := l to high(a) do
        if a[j] = i  then
        begin
        vse := true;
        if n > j then
          n := j;
        if k < j then
          k := j;
        break;
        end;
      if vse = false then
        break;
    end;
    if vse then
    begin
      count := (k - n) + 1;
      if mincount > count then
        mincount := count;
        l := n + 1;
      result := vse;
    end
      else
      break;
  end;
end;

begin
  writeln('Сколько искать?');
  readln(q);

  min := 0;
  max := q;
  for i := low(a) to high(a) do
    a[i] := min + random(max - min + 1);

  mincount := high(a);
  if Shortest(q, a, mincount) then
    writeln('Минимальный отрезок: ', mincount)
  else
    writeln('В массиве представлены не все числа');

  for i := low(a) to high(a) do
    write(a[i], ' ');


  write('Программа завершила свою работу');
  readln();
end.
vedro-compota's picture

Концептуально простое решение:
1) создать функцию, которая проверяет заданный отрезок (по индексам) на наличия набор чисел (две координаты границы отрезка и значение k)
2) Написать алгоритм нарезки/перебора вариантов отрезков - начиная с минимально возможного
-- реализовать такой подход

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