Задача 17 Урок 15
Primary tabs
Дан массив длиной N (не более 100 элементов), состоящий из
случайно выбранных чисел из диапазона от 0 до k, где 0 Найдите в этом массиве длину самого короткого фрагмента,
который содержит все числа от от 0 до k.
Например:Для N = 6, k=2:
20221длина=41
Для N = 10, k=2:2022110012длина=3
Для N = 15, k=3:20223300230321длина=40
Для N = 7, k=2:010002длина=50
Для быстрой проверки кода через запуск используйте следующий тип массива:type ArrOfInt = array[1..100] of integer; пример массива 0 0 3 1 3 0 0 1 0 3 2 2 0 2 2 3 3 3 1 1 1 3 1 2 0
type ArrOfInt = array[1..25] of integer; var k: integer; a: ArrOfInt; procedure printArray(a1: ArrOfInt); //п-а печати массива var i1: integer; begin writeln('Длина массива: ', length(a1)); for i1 := low(a1) to high(a1) do write(a1[i1], ' '); end; function f1(k1: integer; a1: ArrOfInt): ArrOfInt; // ф-я создаем массив var i1: integer; begin randomize(); for i1 := low(a1) to high(a1) do //создаем массив и наполняем его a1[i1] := random(k1 + 1); result := a1; end; function f2(k1: integer; a1: ArrOfInt): boolean; //ф-я проверки, что есть все числа var i1, j1: integer; s: boolean; begin s := false; for i1 := 0 to k1 do begin s := false; for j1 := low(a1) to high(a1) do if i1 = a1[j1] then begin s := true; break; end; if s = false then break; end; result := s; end; function f3(k1: integer; a1: ArrOfInt): integer; //ф-я индекса отрезков var i1, j1, y1, c1{счетчик}, m1{начало отрезка}, p1{конец отрезка}, m2, p2, dif1, dif2: integer; begin c1 := 0; dif1 := 100; dif2 := 100; m1 := high(a1); p1 := low(a1); for y1 := low(a1) to (high(a1) - k) do //первый цикл begin m1 := high(a1); p1 := low(a1); dif2 := 100; for i1 := 0 to k1 do //второй цикл begin for j1 := y1 to high(a1) do //третий цикл begin if (i1 = a1[j1]) and (j1 <= m1) then begin m1 := j1; inc(c1); if (i1 = a1[j1]) and (j1 >= p1) then begin p1 := j1; inc(c1); end; break; end; if (i1 = a1[j1]) and (j1 >= p1) then begin p1 := j1; inc(c1); break; end else if (i1 = (a1[j1])) then begin inc(c1); break; end; end; end; if c1 = k1 + 2 then dif2 := p1 - m1 + 1; c1 := 0; if dif2 < dif1 then begin dif1 := dif2; m2 := m1; p2 := p1; end; end; result := dif1; end; begin randomize(); k := random(10) + 1; writeln('Новое значение k = ',k); a := f1(k, a); printArray(a); writeln(); writeln('Все значения встречаются: ', (f2(k, a))); if (f2(k, a)) then write('На отрезке размером: ',f3(k, a)); readln(); end.
КОНСОЛЬ
Новое значение k = 5 Длина массива: 25 2 5 2 0 2 2 3 4 3 5 4 5 0 2 1 0 4 1 1 0 5 2 0 0 1 Все значения встречаются: TRUE На отрезке размером: 7
- Log in to post comments
- 1947 reads
vedro-compota
Sun, 11/21/2021 - 13:30
Permalink
добавить решение с
добавить решение с переиспользованием фукции из задачи 15 http://fkn.ktu10.com/?q=node/14144
_____________
матфак вгу и остальная классика =)
Vitaliy123
Sun, 11/21/2021 - 19:22
Permalink
Решение с переиспользованием фукции из задачи 15 (function f2)
КОНСОЛЬ
vedro-compota
Sun, 11/28/2021 - 13:09
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)