Решение №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
- 804 reads