Задача 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
- 1229 reads
vedro-compota
Sun, 09/05/2021 - 11:59
Permalink
переиспользовать функцию из
переиспользовать функцию из задачки http://fkn.ktu10.com/?q=node/13214#comme...
_____________
матфак вгу и остальная классика =)