Задача 16 урок 15
Primary tabs
Задача 16 урок 15
Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
var a: array[1..30] of integer;
k, i, c, s, t, z, h: integer;
flag: boolean;
begin
flag:=true;
h:=1; //индекс фрагментов /c
z:=0; //счетчик совпадений
t:=0; //сдвиг основного ряда
randomize();
writeln('vvedite k: 0 <= k < N');
readln(k);
c:=k; //минимальная длина фрагмента
for i:= low(a) to high(a) do
begin
a[i] := random(k); //формеруем основной массив
write(a[i],' ');
end;
writeln();
while (flag) do
begin
writeln(h+t);
for i:=0 to (c) do // перебор значений k
begin
for s:= (h+t) to (h+t+c-1) do //перебор основного ряда по фрагментам
begin // из 'c' элементов
if s >= high(a) then
break
else if a[s] = i then
begin
z:=z+1;
break;
end;
end;
end;
if (z = k) then //если счетчик совпадений = k
begin
writeln('dlina fragmenta = ', c);
flag:=false;
end;
z:=0; //обнуляем совпадения
h:=h+c; //переходим к следующемуфрагменту
if h >= high(a)then //если закончился первый прербор
begin
h:=1; //обнуляем h до 1
t:=t+1; //смещаем начало фрагмента
end;
if t = c then //если сместили до макс. длины фрагмента:
begin
t:=0; //обнуляем смещение
c:=c+1; //увеличиваем длину фрагмента
end;
if c >= high(a) then //по идеи такое случиться только если
begin //random() не выдаст один из всех
writeln('net variantov'); //возможных вариантов
break;
end;
end;
readln;
end.- Log in to post comments
- 1356 reads
vedro-compota
Sun, 09/05/2021 - 11:59
Permalink
переиспользовать функцию из
переиспользовать функцию из задачки http://fkn.ktu10.com/?q=node/13214#comment-5341
_____________
матфак вгу и остальная классика =)