Урок 15. Задача 18.
Primary tabs
Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
type ArrOfInt = array [1..100] of integer;
var k, N :integer;
Arr :ArrOfInt;
function random_array() :ArrOfInt; // создаем массив
var i :integer;
Arr :ArrOfInt;
begin
randomize;
for i := 1 to 100 do
Arr[i] := random(9);
random_array := Arr;
end;
function segment_in(k :integer; Arr :ArrOfInt) :boolean; // ищем отрезок
var i, j :integer;
fl :boolean;
begin
for i := 0 to k do // отрезок
begin
fl := false;
for j:= low(Arr) to high(Arr) do
if i = Arr[j] then
begin
fl := true;
break;
end;
if not fl then
break;
end;
segment_in := fl;
end;
function search_seg(k, m, p :integer; Arr :ArrOfInt) :boolean; // ищем самый короткий отрезок
var i, j :integer;
fl :boolean;
begin
for i := 0 to k do
begin
fl := false;
for j:= m to p do
if i = Arr[j] then
begin
fl := true;
break;
end;
if not fl then
break;
end;
search_seg := fl;
end;
function search_short(k :integer; Arr :ArrOfInt) :integer; // нарезаем отрезки
var i, m, p :integer;
begin
for i := k + 1 to high(Arr) do
begin
for m := 1 to high(Arr) - i do
begin
p := m + i - 1;
if search_seg(k, m, p, Arr) then
break;
end;
if search_seg(k, m, p, Arr) then
break;
end;
search_short := i;
end;
begin
Arr := random_array();
k := 4;
if segment_in(k, Arr) then
N := search_short(k, Arr);
write('Самый короткий отрезок = ', N);
readln();
end.
- Log in to post comments
- 2284 reads
vedro-compota
Thu, 07/28/2022 - 20:02
Permalink
сначала решим 17-ю
сначала решим 17-ю
_____________
матфак вгу и остальная классика =)
vedro-compota
Sun, 09/11/2022 - 14:57
Permalink
добавить альтернативное
добавить альтернативное решение на основе функции num_in()
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/14/2022 - 19:22
Permalink
1)
1)
-- почему именно 4? за что отвечает эта переменная.
Прокомментировать крактко ключевые моменты
2) за что отвечает segment_in()
_____________
матфак вгу и остальная классика =)
Dennis80
Wed, 09/21/2022 - 15:23
Permalink
type ArrOfInt = array [1..100
type ArrOfInt = array [1..100] of integer; var k, N :integer; Arr :ArrOfInt; function random_array() :ArrOfInt; // создаем массив var i :integer; Arr :ArrOfInt; begin randomize; for i := 1 to 100 do Arr[i] := random(9); random_array := Arr; end; { ищет вхождение чисел от 0 до k в массиве если числа найдены переходим к поиску отрезка } function segment_in(k :integer; Arr :ArrOfInt) :boolean; // ищем числа var i, j :integer; fl :boolean; begin for i := 0 to k do // отрезок begin fl := false; for j:= low(Arr) to high(Arr) do if i = Arr[j] then begin fl := true; break; end; if not fl then break; end; segment_in := fl; end; // ищет отрезок по переданным координатам function search_seg(k, m, p :integer; Arr :ArrOfInt) :boolean; var i, j :integer; fl :boolean; begin for i := 0 to k do begin fl := false; for j:= m to p do if i = Arr[j] then begin fl := true; break; end; if not fl then break; end; search_seg := fl; end; // ищет отрезок начиная с меньшего по длине function search_short(k :integer; Arr :ArrOfInt) :integer; // нарезаем отрезки var i, m, p :integer; begin for i := k + 1 to high(Arr) do begin for m := 1 to high(Arr) - i do begin p := m + i - 1; if search_seg(k, m, p, Arr) then break; end; if search_seg(k, m, p, Arr) then break; end; search_short := i; end; begin Arr := random_array(); k := 4; // числа участвующие в поиске от 0 до k if segment_in(k, Arr) then // ищет отрезок в массиве из чисел от 0 до k N := search_short(k, Arr); // ищет отрезок начиная с меньшего по длине write('Самый короткий отрезок = ', N); readln(); end.vedro-compota
Wed, 09/21/2022 - 19:23
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)