Задача 20 Урок 15
Primary tabs
Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 00 до k, где 0≤k
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
type
myArr = array [1..100] of integer;
//myArr = array [1..10] of integer;
var
min, max: integer;
a: myArr;
i,i2, j: integer; // счётчики
p,m,k:integer;
c:boolean; // для цикла поиска если сегмент будет найден
v:integer; // заводим переменную v если сегмент не будет найден
function searchoneM(a: myArr): integer;
var b:boolean;
begin
b:=false;
for i := low(a) to high(a) do
if b=false then
begin
if a[i]=0 then
begin
m:=i;
b:=true;
end;
end
else break;
end;
function searchoneP(m,k:integer; a: myArr): integer;
var b:boolean;
begin
b:=false;
for i := m to high(a) do
if b=false then
begin
if a[i]=k then
begin
p:=i;
b:=true;
end;
end
else break;
end;
function searchNum(m,p,k: integer; a: myArr): boolean;
begin
for i := 0 to k do
begin
result := false;
for j := m to p do
if i = a[j] then
begin
result := true;
break;
end;
if result = false then
break;
end;
end;
function searchNextM(a: myArr; p: integer): integer;
var b:boolean;
begin
b:=false;
for i := p to high(a) do
if b=false then
begin
if a[i]=0 then
begin
m:=i;
b:=true;
end;
end
else break;
end;
function searcNextP(m,k:integer; a: myArr): integer;
var b:boolean;
begin
b:=false;
for i := m to high(a) do
if b=false then
begin
if a[i]=k then
begin
p:=i;
b:=true;
end;
end
else break;
end;
begin
c:=false;
randomize();
//a[1]:=3;
//a[2]:=3;
//a[3]:=3;
//a[4]:=3;
//a[5]:=3;
//a[6]:=0;
//a[7]:=1;
//a[8]:=2;
//a[9]:=3;
//a[10]:=4;
min := 0;
max := 10;
for i := low(a) to high(a) do
a[i] := min + random(max - min + 1);
writeln('enter k');
readln(k);
m:=searchoneM(a); // ищем первое m
p:=searchoneP(m,k,a); // ищем первое p
repeat
if (searchNum(m,p,k, a)) then // передаём и возвращаем функцию
begin
c:=true;
writeln('Everything is on the segment',' ','from',' ', m,' ', 'to',' ',p);
for i := m to p do
write(a[i], ' ');
writeln();
writeln('original');
for i := low(a) to high(a) do
write(a[i], ' ');
end
else
m:=searchNextM(a,p); // если в первом случае не найдено и т.д.
p:=searcNextP(m,k,a); // если в первом случае не найдено и т.д.
v+=1;
if v=100 then
begin
writeln();
writeln('the segment was not found');
writeln();
writeln('original');
for i := low(a) to high(a) do
write(a[i], ' ');
end;
until (c=true) or (v=100);
writeln();
write('End');
readln();
end.
Вывод консоли:
enter k 3 Everything is on the segment from 49 to 70 0 2 1 4 7 5 1 9 6 1 1 10 8 2 1 2 8 4 5 7 0 3 original 8 4 2 10 5 2 3 7 4 2 4 3 0 3 5 4 8 7 9 6 8 10 5 3 0 4 3 4 6 4 8 3 6 6 4 6 3 9 4 7 1 6 1 7 3 10 4 2 0 2 1 4 7 5 1 9 6 1 1 10 8 2 1 2 8 4 5 7 0 3 10 5 10 9 0 1 4 9 3 8 3 2 0 9 6 4 10 10 10 0 4 7 8 0 3 6 1 9 10 9 End
- Log in to post comments
- 465 reads