Как найти номер последнего максимума

1
2
3
4
5
6
7
8
9
10
11
12
13
from random import randint #импорт функции randint из модуля random
a = [randint(0,10) for i in range(10)] #выражение списка, где вызываем ф-цию randint "in range(10)", то есть 10 раз
print(a)#вывод a
a = [-1] + a + [-1]#добавим с двух сторон списка -1,
#чтобы при сравнении соседей крайних элементов не вышло путаницы с индексами,
#например мы хотим получить соседей 3 элемента в a=[1,2,3],i=2 набираем
#a[i+1] и a[i-1], в итоге получим ошибку из-за того, что обратились к a[3], это выходит за границы списка,
#то же и с первым эл-том, если набрать a[i-1] при i=0, ошибки не будет, но вернется -1 элемент, то есть последний, что также нежелательно
for i in range(-2,-(len(a)),-1): #цикл по range от -2 до -длины списка, с шагом -1, то есть -2,-3,...,-(len(a)) 
    if a[i-1]<a[i]>a[i+1]: #условие: (a[i] больше соседей) == True
        print((len(a)-2)+(i+1)) #если условие == True, вывести индекс, его получаем через длину -2, потому что два эл-та добавляли с концов,
        #и i+1, потому что при сравнении мы обращались к элементам с конца, а с конца счет идет от -1 а не от 0 как если бы мы перебирали с начала списка
        break #прерывание цикла

Array33. Дан массив размера $$N$$. Найти номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).

Решение:

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

27

28

#include <stdio.h>

int main(void)

{

    int a[10];

    int n;

    printf(“N: “);

    scanf(“%i”,&n);

    int i;

    for (i=0; i<n; ++i){

        printf(“a[%i] : “,i+1);

        scanf(“%i”,&a[i]);

    }

    if (a[n1]>a[n2]){

        printf(“%i n”,n);

    } else {

        i = n2;

        while ((i>=1) && !((a[i-1]<a[i]) &&(a[i]>a[i+1]))) {

                –i;

            }

        printf(“%i n”,i+1);

        }

    return 0;

}

Другие задачи из раздела Array можно посмотреть здесь.

dmitrylogvinov, Вы в корне неправильно подходите к обучению. Вам нужно больше времени проводить с учебником и изучать стандартные библиотеки (и в первую очередь – встроенные функции, обращая особое внимание на их параметры), а не пытаться решать задачи “в лоб”, раз за разом городя конструкции в стиле Delphi из базового синтаксиса, примерно одинакового для каждого языка. “Батарейки” в Python присутствуют как раз для того, чтобы не изобретать велосипеды.

Задача решается просто и элегантно:

from itertools import count

def lastmax(*sequence):
    return max(zip(sequence, count()))

assert lastmax(1, 2, 3) == (3, 2)
assert lastmax(1, 2, 1, 2, 1) == (2, 3)
assert lastmax(1, 2, 3, 4, 5) == (5, 4)
assert lastmax(1, 1, 1, 1, 1) == (1, 4)

Те же самое, но без itertools:

def lastmax(*sequence):
    return max(zip(sequence, range(len(sequence))))

Ещё вариант:

from operator import itemgetter

def lastmax(*sequence):
    return max(enumerate(sequence), key=itemgetter(1, 0))[::-1]

И ещё:

def lastmax(*sequence):
    return max({v: i for i, v in enumerate(sequence)}.items())

Есть и ещё несколько более эзотерических вариантов – например, через heapq.

array30-36

Приветствуем читателей нашего сайта! Сегодня мы с вами решим задачи Array30-36.

Задачи Array30-36

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

program array30;

var
  A: array[1..10] of integer;
  N, k, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  k := 0;
  for i := 1 to N - 1 do
    if A[i] > A[i + 1] then
    begin
      inc(k);
      write(i, ' ')
    end;
  writeln;
  write(k);
end.

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

program array31;

var
  A: array[1..10] of integer;
  N, k, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  k := 0;
  for i := 2 to N do
    if A[i] > A[i - 1] then
    begin
      inc(k);
      write(i, ' ')
    end;
  writeln;
  write(k);
end.

Array32°. Дан массив размера N. Найти номер его первого локального минимума (локальный минимум — это элемент, который меньше любого из своих соседей).

program array32;

var
  A: array[1..10] of integer;
  N, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  
  for i := 2 to N - 1 do
    if (A[i] < A[i - 1]) and (A[i] < A[i + 1]) then
    begin
      write(i, ' ');
      exit; {завершает программу}
    end;
  writeln(0); {если минимума нет}
end.

Array33. Дан массив размера N. Найти номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).

program array33;

var
  A: array[1..10] of integer;
  N, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  
  for i := N - 1 downto 2 do
    if (A[i] > A[i - 1]) and (A[i] > A[i + 1]) then
    begin
      write(i, ' ');
      exit;
    end;
  writeln(0); {если максимума нет}
end.

Array34. Дан массив размера N. Найти максимальный из его локальных минимумов (определение локального минимума дано в задании Array32).

program array32;

var
  A: array[1..10] of integer;
  N, max, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  
  max := -MaxInt;
  
  for i := 2 to N - 1 do
    if (A[i] < A[i - 1]) and (A[i] < A[i + 1]) then if A[i] > max then max := A[i];
      
  writeln(max); 
end.

Array35. Дан массив размера N. Найти минимальный из его локальных максимумов (определение локального максимума дано в задании Array33).

program array35;

var
  A: array[1..10] of integer;
  N, min, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  
  min := MaxInt;
  
  for i := N - 1 downto 2 do
    if (A[i] > A[i - 1]) and (A[i] > A[i + 1]) then
      if A[i] < min then min := A[i];
      
  writeln(min); 
end.

Array36. Дан массив размера N. Найти максимальный из его элементов, не являющихся ни локальным минимумом, ни локальным максимумом (определения локального минимума и локального максимума даны в заданиях Array32 и Array33). Если таких элементов в массиве нет, то вывести 0 (как вещественное число).

program array36;

var
  A: array[1..10] of integer;
  N, max, i: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите элементы массива: ');
  for i := 1 to N do
    read(A[i]); 
  
  max := -MaxInt;
  
  for i := 2 to N-1 do
    if not((A[i] > A[i - 1]) and (A[i] > A[i + 1])) and 
    not((A[i] < A[i - 1]) and (A[i] < A[i + 1])) then if A[i] > max then max := A[i];
  {проверяем те элементы, которые не были проверены в цикле}
  if a[1] > max then max := a[1];
  if a[N] > max then max := a[N];
      
  writeln(max); 
end.

На сегодня всё! Если у вас возникли вопросы, задавайте их в комментариях. И не забывайте рассказывать о нашем сайте своим друзьям!

Рассмотрим
процесс поиска максимума и его номера
на приведенном выше примере:

Начало

0
> – 4

-5
< 0

9
> 0

9

9

2
<
9

Результат

Amax

-4

0

0

9

9

9

9

Kmax

1

2

2

4

4

4

4

Сначала
считаем максимальным элементом первый.

Затем,
просматривая поочередно все
остальные

элементы массива, сравниваем каждый из
них с текущим значением максимума (с
Amax).

Если
текущий элемент больше Amax,
то заменяем значение Amax
на значение текущего элемента, а значение
Kmax
– на его номер.

10.
Алгоритм

(блок-схема)

Основной
алгоритм (Абстракция А0) Раскрываем
абстракцию A0.1

11.
Программный код
.

Написать
самостоятельно, используя цикл
for
и ветвление
if
внутри него.

Подсказки
в файле
spkmmu.doc
и
Coding.doc,
а также
A0_440.doc

Замечание
1
.
При решении данной задачи можно обойтись
без переменной Amax.
При этом для сравнения с текущим элементом
и при выводе результата указать на
значение максимального элемента можно
по его индексу в массиве: a[Kmax].

Замечание
2
.
В вашей задаче может быть экстремального
значения не просто самого элемента, а
заданного арифметического
выражения
.
Тогда за начальное значение Amax
берется значение первого выражения (а
не просто элемента) и вводится
дополнительная переменная (Zmax,
например) для хранения текущего значения
выражения, чтобы затем сравнить его с
Amax.

Замечание
3.
Для поиска минимума
заменяем знак при сравнении текущего
и экстремального значения с “>”
на “<“. Желательно также сменить
и названия переменных на Amin,
Kmin,
Zmin
для улучшения читабельности кода.

Замечание
4
.
В массиве элементы могут совпадать,
и поэтому при поиске номера требуется
уточнение: найти номер первого
(последнего)
максимума (минимума), что и было сделано
в уточненной постановке рассмотренной
задачи. Например, в массиве a
= (1, 9, 2, 3, 9, 7) Amax
=
9, Kmax
=
2 при поиске первого
максимума и Kmax
=
5 при поиске последнего
элемента с максимальным значением. Если
при поиске первого
для проверки используется знак > (<);
то при поиске
последнего
:
он заменяется на >= (<=); или, не меняя
знака, элементы массива можно перебирать
с конца («последний с начала» = «первый
с конца»), тогда за начальное значение
Amax
берется значение последнего
элемента и используется цикл с
уменьшающимся параметром (for
i:=
n-1
downto
1 do)

Рис.
Раскрытие абстракции A0.1
для поиска максимума в матрице

Замечание
5
.
Метод поиска экстремума Bmax
в матрице
b(nm)
из n
строк и m
столбцов и двух(!) его индексов imax,
jmax
аналогичен, но надо учесть, что все
элементы матрицы перебираются с помощью
двух вложенных один в другой циклов:
один – по строкам, другой – по столбцам
(элементам строки), и что начинаем оба
цикла с первого элемента (i
= 1, j
= 1), а не со второго, иначе потеряется
целый столбец или строка:

Рис.
Потеря
строки или столбца ри поиске не с первого
элемента

Замечание
6
.
Если экстремальные элементы надо найти
для всех (каждой в отдельности) строк
или столбцов матрицы, то результатом
будет не простая
переменная

Amax,
а одномерный
массив
из n
или m
элементов соответственно.

Задание
1 для выполнения на занятии
:
В заданном одномерном массиве X
из m
элементов найти номер и значение
элемента, для которого минимально
значение произведения Xisin(Xi).
Только блок-схему алгоритма. Если в
массиве окажется несколько элементов
с минимальным значением, найти номер
последнего
из них двумя способами: при обходе
массива от начала к концу и при обходе
с конца в начало.

Задание
2 для выполнения на занятии
:
переделать готовую блок-схемы из
предыдущего задания для аналогичного
поиска в матрице при обходе ее слева
направо сверху вниз.

Соседние файлы в папке 5. Sort

  • #
  • #

    31.03.201525 б12input.txt

  • #

    31.03.201568 б11output.txt

  • #

    31.03.2015376 б10Sort.cfg

  • #

    31.03.20151.86 Кб9Sort.dof

  • #

    31.03.20152.44 Кб9Sort.dpr

Добавить комментарий