Решение №15 из главы 15.Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k
Primary tabs
Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
Например:Для N = 6, k=2:
202211 длина=4
Для N = 10, k=2:
2022110012 длина=3
Для N = 15, k=3:
202233002303210 длина=4
Для N = 7, k=2:
0100020 длина=5
program seq_in_list15_15;
{ Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k<N.
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
}
type Arr = array[1..100] of integer; // секция обьявления типов
{ функция возвращает boolean значение }
function seq_in_list( seq_in: Arr; ls_in: Arr; len_seq: integer; ran : integer): boolean;
var n, i, j : integer;
begin // начало тела функции
n := 0;
for i:=1 to ran do
begin
for j:=1 to len_seq do
begin
if( seq_in[i] ) = ( ls_in[j] ) then
begin
n += 1;
break
end;
end;
end;
if(n = ran) then
seq_in_list := True
else
seq_in_list := False;
end; // завершение тела функции }
var
i, j, k, b, m, count, len_list, range, step_len : integer;
fl: boolean;
list_seq: Arr; // массив от 0 до k
Arr_rand: Arr; // массив из случайно выбранных чисел из диапазона от 0 до k
checklist: Arr; // массив для проверки
begin // основная программа
k := 1;
b := 1;
m := 1;
count := 0;
fl := True;
writeln('Input range');
read(range);
for i:=1 to range do // заполнение первого массива от 1 до range
list_seq[i] := i;
len_list := high(Arr_rand);
step_len := range;
for i:=1 to range do // вывод первого массива
write( list_seq[i], ' ');
writeln();
for j:=1 to high(Arr_rand) do // заполнение второго массива
Arr_rand[j]:=random(range)+1;
for j:=1 to high(Arr_rand) do
write( Arr_rand[j], ' '); // вывод второго массива
writeln();
while (step_len <= len_list) and (fl = True) do
begin
j := 0;
{ кол-во проходов фрагмента, например в l = [1, 6, 4, 5, 1, 4, 2] кол-во
проходов из 3 элементов ([1,6,4], [6,4,5], [4,5,1],[5,1,4]),[1,4,2])
будет = 5 с каждым новым витком уменьшая число проходов, например
в l = [1, 6, 4, 5, 1, 4, 2] кол-во
проходов из 4 элементов ([1,6,4,5], [6,4,5,1], [4,5,1,4],[5,1,4,2])
будет = 4 и т.д }
while(j < len_list - range + 1 - count) do
begin
i := m;
while(i <= step_len) do
begin
checklist[b] := Arr_rand[i]; // список для проверки
b += 1;
i += 1;
end;
for k:=1 to (range + count)do // вывод списка
write(checklist[k], ' ');
writeln();
{ вызов функции }
if(seq_in_list(list_seq,checklist,range + count, range)) then
begin
writeln('True');
for i:=1 to (range + count) do // вывод результата
begin
write(checklist[i],' ');
end;
fl := False;
break
end
else
{ значения проверяемого списка делаем равным нулю если функция
вернула отрицательный результат }
for k:=1 to(step_len) do
checklist[k] := 0;
step_len += 1; // увеличение шага проверки
j += 1;
b := 1;
m += 1;
end;
m := 1;
count += 1;
step_len := range + count;
if not fl then // выход из цикла
break
end;
if(step_len >= len_list) then
writeln('False');
end.- Log in to post comments
- 1330 reads