Для решения задачи о нахождении наименьшего расстояния между двумя локальными максимумами в последовательности натуральных чисел, завершающейся числом 0, можно воспользоваться алгоритмом на Python. Давайте разберём всё по шагам.
Постановка задачи
- Локальный максимум — это число, которое больше соседей слева и справа.
- Начальное и конечное число последовательности не считаются локальными максимумами.
- Последовательность заканчивается числом
0
, которое не участвует в анализе (оно служит лишь как признак завершения ввода).
- Если в последовательности нет двух локальных максимумов, то результат —
0
.
Алгоритм решения
- Считываем последовательность чисел.
- Последовательно проверяем каждый элемент (кроме первого и последнего, а также числа 0) на условие локального максимума.
- Если элемент является локальным максимумом, запоминаем его позицию.
- Вычисляем расстояния между всеми найденными локальными максимумами и находим минимальное из них.
- Если локальных максимумов меньше двух, выводим
0
.
Реализация на Python
def find_min_distance():
# Ввод последовательности
sequence = []
while True:
n = int(input("Введите число (0 для завершения): "))
if n == 0:
break
sequence.append(n)
# Инициализация переменных
local_max_positions = [] # Для хранения индексов локальных максимумов
# Поиск локальных максимумов
for i in range(1, len(sequence) - 1):
if sequence[i - 1] < sequence[i] > sequence[i + 1]:
local_max_positions.append(i)
# Если локальных максимумов меньше двух, расстояние — 0
if len(local_max_positions) < 2:
return 0
# Вычисление минимального расстояния между локальными максимумами
min_distance = float('inf') # Изначально бесконечно большое значение
for j in range(1, len(local_max_positions)):
distance = local_max_positions[j] - local_max_positions[j - 1]
if distance < min_distance:
min_distance = distance
return min_distance
# Вызов функции
result = find_min_distance()
print("Наименьшее расстояние между двумя локальными максимумами:", result)
Объяснение кода
- Чтение последовательности: Читаем числа из ввода, пока не встретим
0
. Все числа сохраняем в список sequence
.
- Поиск локальных максимумов: Проходим по элементам списка (от второго до предпоследнего элемента) и проверяем условие локального максимума:
sequence[i - 1] < sequence[i] > sequence[i + 1]
. Индексы таких элементов сохраняем в local_max_positions
.
- Проверка количества максимумов: Если найдено меньше двух локальных максимумов, сразу возвращаем
0
.
- Нахождение минимального расстояния: Перебираем пары соседних индексов локальных максимумов в
local_max_positions
и вычисляем разницу между ними. Находим минимальное значение среди всех таких расстояний.
- Вывод результата: Возвращаем минимальное расстояние между локальными максимумами.
Пример работы
Ввод:
Введите числа (завершите ввод 0):
1
3
2
4
1
5
0
Обработка:
- Последовательность:
[1, 3, 2, 4, 1, 5]
- Локальные максимумы:
3 (индекс 1)
и 4 (индекс 3)
и 5 (индекс 5)
- Расстояния:
3 - 1 = 2
, 5 - 3 = 2
- Минимальное расстояние:
2
Вывод:
Наименьшее расстояние между двумя локальными максимумами: 2
Если нет двух локальных максимумов
Ввод:
Введите числа (завершите ввод 0):
1
2
3
0
Обработка:
- Последовательность:
[1, 2, 3]
- Локальные максимумы: нет
- Вывод:
0
.
Вывод:
Наименьшее расстояние между двумя локальными максимумами: 0
Реализация на Pascal
Для тех, кто использует Pascal, вот аналогичная программа:
program MinDistanceLocalMax;
var
sequence: array[1.1000] of integer;
local_max_positions: array[1.1000] of integer;
n, i, count, min_distance, distance: integer;
begin
count := 0;
{ Ввод последовательности }
writeln('Введите числа (0 для завершения):');
i := 0;
repeat
inc(i);
read(sequence[i]);
until sequence[i] = 0;
{ Поиск локальных максимумов }
for n := 2 to i - 1 do
begin
if (sequence[n - 1] < sequence[n]) and (sequence[n] > sequence[n + 1]) then
begin
inc(count);
local_max_positions[count] := n;
end;
end;
{ Если максимумов меньше 2, вывести 0 }
if count < 2 then
begin
writeln(0);
exit;
end;
{ Поиск минимального расстояния между максимумами }
min_distance := 10000; { Большое значение }
for n := 2 to count do
begin
distance := local_max_positions[n] - local_max_positions[n - 1];
if distance < min_distance then
min_distance := distance;
end;
{ Вывод результата }
writeln('Наименьшее расстояние между двумя локальными максимумами: ', min_distance);
end.
Вывод
Данный алгоритм работает для произвольной последовательности чисел. Python-код более универсален для современных задач, но Pascal также подходит для этой задачи. Выбор зависит от ваших предпочтений или учебных требований.