Гистограмма Гистограмма является многоугольником, сформированным из последовательности прямоугольников, выровненных на общей базовой линии. Прямоугольники имеют равную ширину, но могут иметь различные высоты. Например, фигура слева показывает гистограмму, которая состоит из прямоугольников с высотами 2,1,4,5,1,3,3 2 , 1 , 4 , 5 , 1 , 3 , 3 . Все прямоугольники на этом рисунке имеют ширину, равную 1 1 . Обычно гистограммы используются для представления дискретных распределений, например, частоты символов в текстах. Отметьте, что порядок прямоугольников очень важен. Вычислите область самого большого прямоугольника в гистограмме, который также находится на общей базовой линии. На рисунке справа заштрихованная фигура является самым большим выровненным прямоугольником на изображенной гистограмме. Входные данные В первой строке входных данных записано число n (0<≤106) ( 0 < n ≤ 10 6 ) — количество прямоугольников гистограммы. Далее на той же строке следуют n целых чисел ℎ1 h 1 , ..., ℎ h n , где 0≤ℎ≤109 0 ≤ h i ≤ 10 9 . Эти числа обозначают высоты прямоугольников гистограммы слева направо. Ширина каждого прямоугольника равна 1 1 . Выходные данные Выведите площадь самого большого прямоугольника в гистограмме. Помните, что этот прямоугольник должен быть на общей базовой линии. Примеры Ввод Вывод 7 2 1 4 5 1 3 3 8
Первым делом, нам нужно понять, каким образом находится самый большой прямоугольник в гистограмме. Для этого нам понадобится алгоритм.
Алгоритм нахождения самого большого прямоугольника в гистограмме:
1. Создаем пустой стек, в котором будем хранить индексы прямоугольников гистограммы.
2. Проходим по всем прямоугольникам слева направо.
3. Если стек пуст или высота текущего прямоугольника больше или равна высоте прямоугольника, находящегося в верхней части стека, кладем индекс текущего прямоугольника в стек.
4. Если высота текущего прямоугольника меньше высоты прямоугольника, находящегося в верхней части стека, то:
- Извлекаем индекс прямоугольника из верхней части стека и обозначим его как top.
- Вычисляем площадь прямоугольника, используя следующую формулу: (i - stack[top] - 1) * h[stack[top]], где i - текущий индекс, stack[top] - индекс прямоугольника в верхней части стека, h[stack[top]] - высота прямоугольника в верхней части стека.
- Сравниваем полученную площадь с максимальной площадью, которая была найдена до этого, и обновляем максимальную площадь, если новая площадь больше.
- Повторяем шаги 4 до тех пор, пока стек не станет пустым или пока высота текущего прямоугольника не станет больше или равной высоте прямоугольника, находящегося в верхней части стека.
5. После пройденной итерации, кладем текущий индекс в стек.
6. Повторяем шаги 2-5 до тех пор, пока не пройдем все прямоугольники в гистограмме.
7. Если стек не пуст, то повторяем шаг 4 для всех прямоугольников, находящихся в стеке.
8. Полученная максимальная площадь и будет ответом на задачу.
Теперь, когда мы разобрались с алгоритмом, приступим к его реализации на языке программирования Python.
```python
def max_rectangle_area(n, hist):
stack = [] # Инициализируем пустой стек
max_area = 0 # Инициализируем максимальную площадь как 0
i = 0
while i < n:
# Шаг 3
if len(stack) == 0 or hist[i] >= hist[stack[-1]]:
stack.append(i)
i += 1
# Шаг 4
else:
top = stack.pop()
area = hist[top] * ((i - stack[-1] - 1) if len(stack) > 0 else i)
max_area = max(max_area, area)
# Шаги 7 и 8
while len(stack) > 0:
top = stack.pop()
area = hist[top] * ((i - stack[-1] - 1) if len(stack) > 0 else i)
max_area = max(max_area, area)
return max_area
# Ввод данных
n = int(input())
hist = list(map(int, input().split()))
# Вызов функции и вывод результата
print(max_rectangle_area(n, hist))
```
Теперь все, что осталось сделать - ввести данные (число прямоугольников и их высоты) и получить ответ.
Удачи в изучении математики! Если у тебя возникнут еще вопросы, я всегда готов помочь.