предположим, что у нас есть несколько 2D-боксов в контейнере, окруженном водой. К сожалению, в левой боковой стенке контейнера есть отверстие. Высота этого отверстия больше высоты всех ящиков. Длина всех ящиков 1 м, а их высота целое число. Все ящики ставятся в одну линию. За каждую секунду количество воды, проходящей через контейнер, составляет один квадратный метр. (убедитесь, что наша проблема находится в 2D-контексте). Мы хотим узнать, сколько времени потребуется, чтобы данный ящик оказался на один метр под водой. есть ли какой-нибудь жадный алгоритм для эффективного решения этой проблемы?
что это за жадный подход?
Ответы (1)
Я думаю, что этот алгоритм может решить это за O (n).
из i-го ящика мы сначала идем в конец строки, чтобы найти первый ящик, который выше i-го ящика. так как разница между высотами всех ящиков составляет не менее 1 метра, поэтому вода не может пройти дальше, чем это поле. Затем мы переходим от i-го поля к началу строки. Мы сохраняем высоту i-го поля в переменной Max_Height. Каждый раз, когда мы находим поле выше этого Max_Height, мы обновляем Max-Height.so всякий раз, когда мы находим ящик короче, чем Max_Height мы добавляем (Max_Height - высота ящика) к нашему результату. в конце мы вычислили площадь всех предыдущих и следующих скважин. поэтому нам просто нужно вычислить расстояние между первым следующим более высоким ящиком и первое предыдущее более высокое поле и добавляем его к нашему результату. Вот и все.
i
-м ящике есть вода на 1 метр, не правда ли, что всеi-1
ящики до него наполнились и переполнились? Итак, вы знаете, что общее количество воды, поступившей в систему = вместимость первыхi-1
ящиков + 1 метр воды. Итак, вы выполняете один проход линейной предварительной обработки, после чего можете отвечать на каждый запрос за постоянное время. - person Pradhan   schedule 13.11.2014