Задача о последнем дне переправы по льду

Задачу можно сформулировать так: представьте себе участок реки покрытый льдом и в первый день он полностью скован крепким льдом, позволяющим переправится по любому его участку. Разбив участок реки на R x C секторов, мы заявляем, что каждый день очередной сектор из сетки R x C становится не безопасным для пересечения. Нужно определить последний день, когда реку еще можно перейти по крепкому льду.

Да это, кстати, задача #1970 Last Day Where You Can Still Cross с литкода.

Строки (R) cекторов расположены вдоль русла реки, т.е. надо перебраться с r = 1 на r = R. В задаче даны R, С и массив опасных участков по дням [[ri, ci]], где i — это номер очередного дня.

Решение

Каждый день ситуация ухудшается и с определенного дня переправа становится не возможна. Понятно, что нам не нужно проверять каждый из дней, а можно использовать какой то поисковый алгоритм для определения конкретного дня. Например, бинарный поиск.

Т.е. алгоритм следующий — взяли день из середины текущего диапазона, проверили — можно ли пересечь реку в текущей ситуации. Если можно, то запомнили результат, и левую границу поискового окна сдвинули в середину. Иначе правую границу сдвинули в середину.

Проблема поиска пути

Граничные условия задачи предполагают, что R и C могут достигать 104. Это значит, что нужно как то оптимизировать поиск. Вместо поиска безопасного пути через реку, я буду смотреть нельзя ли прочертить путь вдоль реки по опасным участкам, т.к. именно они нам доступны как исходные данные. Если такой путь существует, то пересечь безопасно реку нельзя.

Давайте посмотрим детали реализации (TS).

Судя по статистике, это довольно эффективное решение (сравнивал среди JS решений), т.к. TS решений было недостаточно для показа графика.

Сложнее всего, наверное, было психологически отказаться от традиционного использования массива-карты для поиска пути. Но вместо него пришлось использовать объект Set, т.к. нам нужно эффективно находить подходящие ячейки для следующего ходя, без перебора массива вручную.

Мало букафф? Читайте есчо !

Задача о подсчете количества путей в словаре

Апрель 16, 2023 г.

Разбираем задачу № 1639 Number of Ways to Form a Target String Given a Dictionary c leetcode.com. Дан словарь, где слова имеют одинаковую длину - words. Также дано дополнительно слово - target, которое нужно составить из словарных слов по следующим правилам: ...

Читать

Классическая задача о размене монет

Январь 24, 2023 г.

Дана сумма amount и номиналы монет. Требуется разменять сумму минимальным набором монет. Если рассматривать набор монет, который используется в реальной жизни, т.е. [1коп, 5коп, 10коп, 50коп, 1р, 2р, 5р, 10р], то во-первых, решение всегда существует, ...

Читать

Поиск самой длинной петли в графе

Март 26, 2023 г.

Как говорили учителя в школе - а теперь для самых умных задача со звездочкой. "Longest cycle in a graph" отмечена как сложная задача на leetcode. Давайте разберем как её решить. Дан массив, который описывает ориентированный граф. В каждой ячейке ...

Читать

87. Scramble string - задача о перетасованных строках

Март 30, 2023 г.

Решаем задачу с литкода о перетасовке строки. Даны две строки, нужно определить является ли вторая строка результатом перетасовки букв в первой. Правила ...

Читать
 

Комментарии к «Задача о последнем дне переправы по льду»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: