Здравствуйте! ☺ На этой странице в задачах minmax16-18 решебника Абрамяна рассматривается вопрос о количестве чисел последовательности, находящихся до первого или после последнего экстремального элемента, а также между ними. Экстремальный элемент – это общее название для минимума и максимума.
Minmax16. Дано целое число N и набор из N целых чисел. Найти количество элементов, расположенных перед первым минимальным элементом.
Если номер первого минимального элемента равен i, то количество элементов перед ним равно i-1. Этим нужно и воспользоваться. Ещё нужно учесть ввиду, что минимальных элементов может быть несколько, поэтому при сравнении числа с минимальным нужно использовать строгое неравенство: a < m
– если оно истинно, то элемент а становится минимальным. Если будет проверятся нестрогое неравенство a ≤ m
, то мы "запомним" последний минимальный элемент. Эта разница хорошо продемонстрирована на странице в задачах Minmax6-11 о первых и последних минимумах и максимах из набора.
var
N, i, numMin: byte;
a, m: integer;
begin
write('N = ');
readln(N);
numMin := 0; { <-- не введено ещё ни одного числа, i=0 }
m := MaxInt; { <-- начальное значение минимума }
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do
begin
read(a);
if (numMin = 0) or (a < m) then
begin
m := a;
numMin := i
end
end;
writeln('Количество элементов ',
'перед первым минимальным: ', numMin - 1);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Но если вы не хотите использовать константу MaxInt для первой инициализации минимума, тогда вам прийдется, например, разбить ввод элементов в два этапа: при первом вводе числа назначаете его минимальным, а количество чисел перед ним count=0. При последующем вводе все по стандарту – число становится минимальным лишь тогда, когда оно меньше предыдущего значения минимума:
var
N, i, count: byte;
a, m: integer;
begin
write('N = ');
readln(N);
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do
begin
read(a);
if i = 1 then { <-- первый ввод }
begin
m := a; { <-- первое число становится минимальным }
count := 0 { <-- количество чисел перед ним равно 0 }
end
else { Остальные числа: }
if a < m then begin
m := a;
count := i - 1
end
end;
writeln('Количество элементов ',
'перед первым минимальным: ', count);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Следующий вариант ничем не отличается от предыдущего, только здесь ввод первого элемента вынесен за границы цикла (сразу перез входом). Тогда остальные числа с индексами 2..N вводятся в самом цикле.
var
N, i, count: byte;
a, m: integer;
begin
write('N = ');
readln(N);
{ Вводим первое число и назначаем его минимумом: }
read(a);
m := a;
count := 0;
{ Вводим остальные числа: }
for i := 2 to N do
begin
read(a);
if a < m then begin
m := a;
count := i - 1
end
end;
writeln('Количество элементов ',
'перед первым минимальным: ', count);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Какой вариант выбырать – это уже ваше дело. Мне лично нравится первый.
Minmax17. Дано целое число N и набор из N целых чисел. Найти количество элементов, расположенных после последнего максимального элемента.
По аналогии с предыдущей задачей, чтобы найти количество элементов после последнего, можно найти сначала номер этого самого последнего максимального числа (обозначим его numLastMax), тогда искомое количество равно N-numLastMax
. А как находить последний максимум мы рассматривали в задаче Найти номера первого минимального и последнего максимального элемента из данного набора и вывести их в указанном порядке..
var
N, i, numLastMax: byte;
a, lastMax: integer;
begin
write('N = ');
readln(N);
{ Вводим первое число и назначаем его максимумом: }
writeln('Введите ', N, ' целых чисел:');
read(a);
lastMax := a;
numLastMax := 1;
{ Ввод остальных N-1 чисел: }
for i := 2 to N do
begin
read(a);
if a >= lastMax then begin
lastMax := a;
numLastMax := i
end
end;
writeln('Количество элементов ',
'после последнего максимального: ', N - numLastMax);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Идея другого способа решения задачи minmax17 состоит в том, что как только в наборе целых чисел мы находим максимальный элемент или равный ему (a ≥ lastMax, строка 13 кода), количество элементов Q после последнего максимального становится равным 0 (строка 16). В остальных случаях (элемент а меньше максимального, строка 18) количество увеличивается на 1.
var
N, i, Q: byte;
a, lastMax: integer;
begin
write('N = ');
readln(N);
lastMax := -MaxInt-1;
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do
begin
read(a);
if a >= lastMax then
begin
lastMax := a;
Q := 0
end
else inc(Q)
end;
writeln('Ответ: ', Q);
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 Minmax18. Дано целое число N и набор из N целых чисел. Найти количество элементов, содержащихся между первым и последним максимальным элементом. Если в наборе имеется единственный максимальный элемент, то вывести 0.
Идея решения этой задачи состоит в определении количества чисел между двумя элементами в наборе последовательных цедых чисел. Если А и В – некоторые два целые числа, то количество чисел МЕЖДУ ними (числа А и В не считаются) равно В-А-1. Так, между 12 и 20 есть 20-12-1=7 чисел (13, 14, 15, 16, 17, 18, 19). Если указанные числа последовательные, то количество элементов между ними, естественно, равно 0.
Таким образом, когда находим максимальный элемент в нашем наборе N чисел, то запоминаем его индекс m1 (строка 16), а если встречаем элемент равный максимальному, то запоминаем второрой индекс m2 (строка 19). В результате, по выходу из цикла мы будем иметь номера m1 и m2 первого и последнего максимума соответственно. Тогда искомое количество чисел между первым и последним максимумом будет равно m2-m1-1. Если m1=m2, то выводится 0.
var
N, i, m1, m2: byte;
a, lastMax: integer;
begin
write('N = ');
readln(N);
lastMax := -MaxInt-1;
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do
begin
read(a);
if a > lastMax then
begin
lastMax := a;
m1 := i
end
else
if a = lastMax then m2 := i
end;
write('Ответ: ');
if m2 > m1 then writeln(m2-m1-1)
else writeln(0);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647