ВВЕРХ
ВНИЗ
  • Home
  • Minmax
  • Minmax 16 - 18

Количество элементов перед первым минимальным

Здравствуйте! На этой странице в задачах minmax16-18 решебника Абрамяна рассматривается вопрос о количестве чисел последовательности, находящихся до первого или после последнего экстремального элемента, а также между ними. Экстремальный элемент – это общее название для минимума и максимума.

Minmax16. Дано целое число N и набор из N целых чисел. Найти количество элементов, расположенных перед первым минимальным элементом.

Если номер первого минимального элемента равен i, то количество элементов перед ним равно i-1. Этим нужно и воспользоваться. Ещё нужно учесть ввиду, что минимальных элементов может быть несколько, поэтому при сравнении числа с минимальным нужно использовать строгое неравенство: a < m – если оно истинно, то элемент а становится минимальным. Если будет проверятся нестрогое неравенство a ≤ m, то мы "запомним" последний минимальный элемент. Эта разница хорошо продемонстрирована на странице в задачах Minmax6-11 о первых и последних минимумах и максимах из набора.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
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.

Но если вы не хотите использовать константу MaxInt для первой инициализации минимума, тогда вам прийдется, например, разбить ввод элементов в два этапа: при первом вводе числа назначаете его минимальным, а количество чисел перед ним count=0. При последующем вводе все по стандарту – число становится минимальным лишь тогда, когда оно меньше предыдущего значения минимума:

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
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.

Следующий вариант ничем не отличается от предыдущего, только здесь ввод первого элемента вынесен за границы цикла (сразу перез входом). Тогда остальные числа с индексами 2..N вводятся в самом цикле.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
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.

Какой вариант выбырать – это уже ваше дело. Мне лично нравится первый.

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

По аналогии с предыдущей задачей, чтобы найти количество элементов после последнего, можно найти сначала номер этого самого последнего максимального числа (обозначим его numLastMax), тогда искомое количество равно N-numLastMax. А как находить последний максимум мы рассматривали в задаче Найти номера первого минимального и последнего максимального элемента из данного набора и вывести их в указанном порядке..

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
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.

Идея другого способа решения задачи minmax17 состоит в том, что как только в наборе целых чисел мы находим максимальный элемент или равный ему (a ≥ lastMax, строка 13 кода), количество элементов Q после последнего максимального становится равным 0 (строка 16). В остальных случаях (элемент а меньше максимального, строка 18) количество увеличивается на 1.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
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.

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.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
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.

До свидания!


Яндекс.Метрика