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

Задачу можно сформулировать так: представьте себе участок реки покрытый льдом и в первый день он полностью скован крепким льдом, позволяющим переправится по любому его участку. Разбив участок реки на 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, т.к. нам нужно эффективно находить подходящие ячейки для следующего ходя, без перебора массива вручную.

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

GreyCode генератор

Май 3, 2023 г.

Задачи с бинарными последовательностями мне очень нравятся из-за их "эвристичности". Решение часто скрывается в двух шагах, но додуматься не просто. Следующая задача описывается так - нужно сгенерировать n-разрядный "серый код". Если вы не ...

Читать

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

Апрель 16, 2023 г.

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

Читать

Задача группировки подобных строк

Апрель 28, 2023 г.

Речь идет о № 839 с leetcode. Формулируется проблема таким образом - дан массив строк, которые отличаются (или не отличаются) друг от друга перестановкой ...

Читать

Задача о наибольшей сумме монет

Апрель 15, 2023 г.

Решаем задачу № 2218 с leetcode - Maximum Value of K Coins From Piles. В названии фигурирует слова монеты и стопки. Если представить себе, что монеты могут быть произвольного номинала, то да - суть именно такая. У нас есть стопки монет, и дано число ...

Читать
 

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

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



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