Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

18. Исполнитель Робот: #297260

Сообщить о проблеме
Задание #297260
Задание было решено верно
Задание было решено неверно

Квадрат разлинован на $N\times N$ клеток, где $1<N<30$. Робот может выполнять только команды вправо и вниз. Между соседними клетками могут находиться стены, через которые пройти нельзя.

В каждой клетке лежит монета достоинством от $1$ до $100$. Посетив клетку, Робот забирает монету с собой, включая начальную и конечную клетки.

Конечной считается «угловая» клетка, у которой справа и снизу находятся стены. Таких клеток может быть несколько. Требуется определить максимальную и минимальную суммы среди всех маршрутов из левой верхней клетки в одну из конечных. В ответе сначала указывается максимальная сумма, затем минимальная.

Пример входных данных:

В исходном файле таблица занимает диапазон $A1:T20$, поэтому $N=20$.

Вертикальные стены расположены справа от $D3:D4$, $G3:G17$, $L5:L7$, $L15:L18$, $R12:R16$, $S3:S5$. Горизонтальные стены расположены снизу от $B4:D4$, $P5:S5$, $J7:L7$, $N16:R16$, $D17:G17$, $I18:L18$.

Расчётную таблицу разместим справа от исходной, начиная с ячейки $V1$.

В $V1$ запишем: $=A1$

В $W1$: $=V1+B1$ и скопируем вправо до $AO1$.

В $V2$: $=V1+A2$ и скопируем вниз до $V20$.

Для поиска максимальной суммы в $W2$ запишем: $=B2+МАКС(W1;V2)$ и скопируем в диапазон $W2:AO20$.

Для первых клеток:

$V1=24$,
$W1=24+22=46$,
$V2=24+12=36$,
$W2=60+\max(46;36)=106$.

Около стен оставляем только разрешённое направление движения. Например, справа от стены $D3:D4$ в клетки $E3:E4$ можно попасть только сверху, поэтому в $Z3$ запишем: $=E3+Z2$ и скопируем до $Z4$.

Справа от стены $G3:G17$ для диапазона $H3:H17$ используем формулу вида: $=H3+AC2$ и копируем вниз.

Под стеной $B4:D4$ в клетки $B5:D5$ можно попасть только слева. В $W5$ запишем: $=B5+V5$ и скопируем вправо до $Y5$.

Аналогично учитываем остальные стены.

Конечными клетками являются $D4$, $S5$, $L7$, $R16$, $G17$, $L18$ и $T20$.

Максимальные суммы в них равны соответственно: $380$, $1366$, $1156$, $1925$, $1254$, $1670$, $2383$.

Следовательно, $\max(380;1366;1156;1925;1254;1670;2383)=2383$.

Для поиска минимальной суммы в обычных клетках используем: $=B2+МИН(W1;V2)$

Для первых клеток: $W2=60+\min(46;36)=96$.

Формулы около стен остаются такими же.

Минимальные суммы в конечных клетках: $240$, $790$, $735$, $1003$, $664$, $1075$, $1376$.

Следовательно, $\min(240;790;735;1003;664;1075;1376)=240$.

Ответ: $2383$ $240$.

Код на Python

Если сохранить таблицу в формате CSV с именем 18-26.csv, результат можно проверить программой:

s = tuple(
    tuple(map(int, row.split(';')))
    for row in open('18-26.csv').read().splitlines()
)

N = len(s)

right = set()

for r1, r2, c in [
    (3, 4, 4), (3, 17, 7),
    (5, 7, 12), (15, 18, 12),
    (12, 16, 18), (3, 5, 19)
]:
    for r in range(r1 - 1, r2):
        right.add((r, c - 1))

down = set()

for r, c1, c2 in [
    (4, 2, 4), (5, 16, 19),
    (7, 10, 12), (16, 14, 18),
    (17, 4, 7), (18, 9, 12)
]:
    for c in range(c1 - 1, c2):
        down.add((r - 1, c))

mn = [[10 ** 9] * N for _ in range(N)]
mx = [[-10 ** 9] * N for _ in range(N)]

mn[0][0] = mx[0][0] = s[0][0]

for i in range(N):
    for j in range(N):
        if i == 0 and j == 0:
            continue

        a, b = [], []

        if j > 0 and (i, j - 1) not in right:
            a.append(mn[i][j - 1])
            b.append(mx[i][j - 1])

        if i > 0 and (i - 1, j) not in down:
            a.append(mn[i - 1][j])
            b.append(mx[i - 1][j])

        if a:
            mn[i][j] = s[i][j] + min(a)
            mx[i][j] = s[i][j] + max(b)

ends = []

for i in range(N):
    for j in range(N):
        wall_right = j == N - 1 or (i, j) in right
        wall_down = i == N - 1 or (i, j) in down

        if wall_right and wall_down:
            ends.append((mn[i][j], mx[i][j]))

print(max(x[1] for x in ends), min(x[0] for x in ends))

Программа выводит: $2383$ $240$.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение