Урок 15 Задача 17

Урок 15 Задача 17

Дан массив длиной N (где 10≤N<100). Найти в этом массиве отрезок длиной F, такой что на нем встречаются все числа от 0 до k, где 0≤k<F.

В качестве ответа (если отрезок найден) получите его начальный и конечных индекс - m
и p ( 1≤m<p≤N, считая что массив индексируется с единицы)
Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (процедуру, которая вычислит нужные индексы, если есть)
Подсказка: можно использовать функцию проверки отрезка в массиве из предыдущей задачи.

Решение:

program u15z17;
type newArr = array [1..100] of integer;
var a:newArr;
  i,j,k,m,p,count:integer;

function randomArr(arr:newArr): newArr;
begin
  for i:=low(arr) to high(arr) do
    arr[i]:=random(31);
  result:=arr;
end;

begin
  randomize;
  a:=randomArr(a);
  writeln();
  m:=100;
  p:=0;
  for i:=low(a) to high(a) do
    write(a[i],'|');
  writeln();
  write('vvedite chislo k: ');
  readln(k);
  count:=-1;
  for j:=0 to k do
  begin
    for i:=low(a) to high(a) do
    begin
      if j=a[i] then
      begin
        count:=count+1;
        if i>p then
          p:=i;
        if i<m then
          m:=i;
        break;
      end;
    end;
  end;
  if count=k then
  begin
    writeln('TRUE');
    writeln('m:',m,'   p:',p);
  end
  else
    writeln('FALSE');
  readln();
end.

Консоль:

10|26|4|4|15|20|5|24|0|9|12|20|25|8|28|29|6|4|19|4|22|22|4|16|28|1|17|11|13|23|9|16|8|22|15|10|26|7|7|19|3|4|21|10|11|8|18|14|24|5|12|28|28|24|23|26|2|28|3|0|22|22|24|4|10|19|2|2|7|15|13|4|10|20|16|8|10|16|28|29|21|1|26|0|16|28|11|25|4|18|9|3|27|17|21|30|1|19|26|30|
vvedite chislo k: 10
TRUE
m:1   p:57
vedro-compota's picture

1) Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (функцию)
2) можно использовать (вызывать) подпрограмму из предыдущей задачи

_____________
матфак вгу и остальная классика =)

Решение:

program u15z17;
type newArr = array [1..100] of integer;
var a:newArr;
  i,j,k,m,p:integer;
  t:boolean;

function randomArr(arr:newArr): newArr;
begin
  for i:=low(arr) to high(arr) do
    arr[i]:=random(31);
  result:=arr;
end;

procedure writeArr(arr:newArr);
begin
  for i:=low(arr) to high(arr) do
    write(arr[i],'|');
  writeln();
end;

procedure otrezok(arr:newArr; k:integer);
begin
  m:=101;
  p:=0;
  for j:=0 to k do
  begin
    t:=FALSE;
    for i:=low(arr) to high(arr) do
    begin
      if j=arr[i] then
      begin
        write(j,' ');
        t:=TRUE;
        if i>p then
          p:=i;
        if i<m then
          m:=i;
        break;
      end;
    end;
    if t=FALSE then
      break;
  end;
  if t then
  begin
    writeln(t);
    writeln('m=',m,'  p=',p);
  end
  else
    writeln(t);
end;

begin
  randomize;
  a:=randomArr(a);
  writeArr(a);
  write('vvedite chislo k: ');
  readln(k);
  otrezok(a,k);
  readln();
end. 

Консоль:

13|14|15|17|2|12|21|6|18|27|26|28|0|4|4|4|18|23|11|13|21|26|27|19|24|9|29|25|23|21|7|10|16|27|15|7|13|12|20|13|14|22|19|18|23|14|7|18|30|28|20|16|27|15|23|30|29|15|14|26|13|28|30|21|6|7|9|22|18|17|17|26|13|15|23|20|17|5|25|14|12|11|15|3|26|3|4|19|21|13|19|5|29|11|11|1|25|24|6|22|
vvedite chislo k: 10
0 1 2 3 4 5 6 7 FALSE

0|25|2|16|13|11|17|22|22|2|21|16|3|1|27|12|2|11|18|9|30|14|23|12|5|16|20|12|20|4|24|4|23|15|30|16|28|0|24|7|23|0|0|5|9|26|16|7|25|7|19|30|17|1|13|9|10|7|26|21|0|22|9|21|1|13|1|12|25|11|13|13|0|24|22|12|24|8|4|27|19|10|25|10|29|20|5|23|25|6|22|2|6|9|20|25|27|3|29|16|
vvedite chislo k: 10
0 1 2 3 4 5 6 7 8 9 10 TRUE
m=1  p=90
vedro-compota's picture

  1. Искать отрезки именно длинной F
  2. Опираться на функцию из предыдущей задачи http://fkn.ktu10.com/?q=node/15254

_____________
матфак вгу и остальная классика =)