Root /ArchiveAbout
()

Первый и последний минимум или максимум из набора

Первый и последний минимум или максимум из набора

Здравствуйте! На этой странице мы будем заниматься нахождением крайних максимумов или минимумов из набора целых чисел, тобто тех максимальных и минимальных элементов, которые встречаются первыми или последними. Это особенно интересно в тех случаях, когда экстремальные элементы встречаются несколько раз (экстремальные – это максимумы или минимумы).

Minmax6. Дано целое число N и набор из N целых чисел. Найти номера первого минимального и последнего максимального элемента из данного набора и вывести их в указанном порядке.

Строки 12 – 15 — это начальная инициалицалия минимума, максимума и их номеров, происходит при первой итерации при i=1. Все остальные вычисления осуществляются при i>1 (строки 16 – 34). Остальные более подробные комментарии в коде программы.

var
  N, i, NumFirstMin, NumLastMax: byte;
  elem, min, max: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  for i := 1 to N do
  begin
    read(elem); { <-- Вводим число }
    if i = 1 then begin { <== ПЕРВЫЙ ввод }
      min := elem; NumFirstMin := 1; { <-- минимум и его номер }
      max := elem; NumLastMax := 1  { <-- максимум и его номер }
    end
    else begin
      { Минимум перезаписываем, если предыдущий минимум min 
      строго больше введенного на данном i-м шаге элемента elеm. 
      Поэтому, если минимальный элемент встречается несколько 
      раз, то запомнится только первый из них: }
      if min > elem then begin
        min := elem; { <-- Запоминаем новый минимум }
        NumFirstMin := i { <-- Номер первого минимума } 
      end;
      { Максимум перезаписываем, если предыдущий максимальный элемент max 
      меньше или равен введенному нами элементу elem. Таким образом мы 
      будем запоминать последнюю позицию максимального элемента (если их 
      несколько). Если неравенство заменить на строгое ( < ), то запомним,
      очевидно, первый из встречающихся максимальных чисел: }
      if max <= elem then begin
        max := elem; { <-- Запоминаем новый максимум }
        NumLastMax := i { <-- Номер последнего максимума }
      end
    end
  end;
  writeln('Ответ: ', NumFirstMin:3, NumLastMax:3);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Minmax7. Дано целое число N и набор из N целых чисел. Найти номера первого максимального и последнего минимального элемента из данного набора и вывести их в указанном порядке.

var
  N, i, NumFirstMax, NumLastMin: byte;
  elem, max, min: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  for i := 1 to N do
  begin
    read(elem); { <-- Вводим число }
    if i = 1 then begin { <== ПЕРВЫЙ ввод }
      max := elem; NumFirstMax := 1; { <-- максимум и его номер }
      min := elem; NumLastMin := 1  { <-- минимум и его номер }
    end
    else begin
      { Равные минимумы учитываются (неравенство нестрогое), 
      поэтому запомним ПОСЛЕДНИЙ минимум: }
      if min >= elem then begin
        min := elem; { <-- Запоминаем новый минимум }
        NumLastMin := i { <-- Номер последнего минимума } 
      end;
      { Равные максимумы не учитываются (строгое неравенство),
      следовательно, запомним ПЕРВЫЙ максимум: }
      if max < elem then begin
        max := elem; { <-- Запоминаем новый максимум }
        NumFirstMax := i { <-- Номер первого максимума }
      end
    end
  end;
  writeln('Ответ: ', NumFirstMax:3, NumLastMin:3);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 А вот немного другой способ решения задачи Minmax7. Отличие только в том, что в строке 12 мы надали минимуму и максимуму начальные значения, равные соответственно maxint и -maxint-1.

var
  N, i, NumFirstMax, NumLastMin: byte;
  elem, max, min: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  { Для начала инициализируем начальные значения: для максимума max
  возьмем -MaxInt-1 – минимальное возможное значение в рамках типа 
  integer, а для минимума min – максимальное MaxInt }
  max := -maxint-1; min := maxint;
  for i := 1 to N do
  begin
    read(elem); { <-- Вводим число }
    { Равные минимумы учитываются (неравенство нестрогое), 
    поэтому запомним ПОСЛЕДНИЙ минимум: }
    if min >= elem then begin
      min := elem; { <-- Запоминаем новый минимум }
      NumLastMin := i { <-- Номер последнего минимума } 
    end;
    { Равные максимумы не учитываются (строгое неравенство),
    следовательно, запомним ПЕРВЫЙ максимум: }
    if max < elem then begin
      max := elem; { <-- Запоминаем новый максимум }
      NumFirstMax := i { <-- Номер первого максимума }
    end
  end;
  writeln('Ответ: ', NumFirstMax:3, NumLastMin:3);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Minmax8. Дано целое число N и набор из N целых чисел. Найти номера первого и последнего минимального элемента из данного набора и вывести их в указанном порядке.

var
  N, i, NumFirstMin, NumLastMin: byte;
  elem, min: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  min := maxint; { <-- Начальное значение минимального элемента }
  NumFirstMin := 1;
  NumLastMin := 1;
  for i := 1 to N do
  begin
    read(elem); { <-- Вводим число }
    { Смысл последующих действий прост: если находим МЕНЬШИЙ 
    минимального элемент: elem < min, то новым минимумом ста-
    новится elem, а если введенный элемент РАВЕН минимальному:
    elem = min, то запоминаем его номер NumLastMin. }
    if elem < min then begin
      min := elem;
      NumFirstMin := i;
      NumLastMin := i
    end else
      if elem = min then NumLastMin := i { <-- Запоминаем позицию 
        последнего минимального элемента  }
  end;
  writeln('Ответ: ', NumFirstMin:3, NumLastMin:3);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Minmax9. Дано целое число N и набор из N целых чисел. Найти номера первого и последнего максимального элемента из данного набора и вывести их в указанном порядке.

var
  N, i, NumFirstMax, NumLastMax: byte;
  elem, max: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  max := -maxint-1; { <-- Начальное значение максимального элемента }
  NumFirstMax := 1;
  NumLastMax := 1;
  for i := 1 to N do
  begin
    read(elem); { <-- Вводим число }
    { Если больший максимального элемент: elem > max, то новым 
    максимумом становится elem, а если введенный элемент равен 
    максимальному: elem = max, то запоминаем его номер NumLastMax. }
    if elem > max then begin
      max := elem;
      NumFirstMax := i;
      NumLastMax := i
    end
    else
      if elem = max then NumLastMax := i { <-- Запоминаем позицию 
        последнего максимального элемента  }
  end;
  writeln('Ответ: ', NumFirstMax:3, NumLastMax:3);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Minmax10. Дано целое число N и набор из N целых чисел. Найти номер первого экстремального (т. е. минимального или максимального) элемента из данного набора.

Суть решения простая: найти первый максимум и минимум (то есть их номера в последовательности), а потом вывести меньший из них – он и будет первым экстремальным элементом.

var
  N, i, NumFirstMax, NumFirstMin: byte;
  elem, min, max: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  max := -maxint-1; min := maxint; { <-- Инициализация }
  i := 0;
  while i < N do begin
    inc(i); { <-- Увеличиваем индекс }
    read(elem); { <-- Вводим число }
    { Если элемент elem больше максимального max, то 
    присваиваем его максимуму и запоминаем номер: }
    if elem > max then begin
      max := elem;
      NumFirstMax := i
    end else
    { Если элемент elem меньше минимального min, то 
    присваиваем его минимуму и запоминаем позицию: }
      if elem < min then begin
        min := elem;
        NumFirstMin := i
      end
  end;
  write('Ответ: ');
  if NumFirstMin > NumFirstMax then writeln(NumFirstMax)
  else writeln(NumFirstMin);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Minmax11. Дано целое число N и набор из N целых чисел. Найти номер последнего экстремального (т. е. минимального или максимального) элемента из данного набора.

Для определения последнего экстремального элемента не обязательно запоминать номера последнего максимуму и минимума, а потом выводить больший из них. Достаточно использовать одну переменную для последнего номера, и здесь не имеет значения максимум это или минимум, поскольку нас интересует именно ПОСЛЕДНЯЯ позиция.

var
  N, i, NumLastExtr: byte;
  elem, min, max: integer;

begin
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' целых чисел:');
  max := -maxint-1; min := maxint;
  i := 0;
  repeat
    inc(i);
    read(elem); { <-- Вводим число }
    { Если элемент не меньше максимального, то 
    перезаписываем максимум и запоминаем порзицию: }
    if elem >= max then begin
      max := elem;
      NumLastExtr := i
    end else
    { Если элемент не больше минимального, то
    перезаписываем минимум и запоминаем номер: }
      if elem <= min then begin
        min := elem;
        NumLastExtr := i
      end
  until i = N;
  writeln('Ответ: ', NumLastExtr);
  readln
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Если что-то неясно или нашли ошибки (такое уже было!), то пишите и спрашивайте.