Урок 15, Задача 20
Primary tabs
Дан массив длиной 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.- Log in to post comments
- 1060 reads
vedro-compota
Mon, 07/17/2023 - 20:05
Permalink
Концептуально простое решение
Концептуально простое решение:
1) создать функцию, которая проверяет заданный отрезок (по индексам) на наличия набор чисел (две координаты границы отрезка и значение k)
2) Написать алгоритм нарезки/перебора вариантов отрезков - начиная с минимально возможного
-- реализовать такой подход
_____________
матфак вгу и остальная классика =)