Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3277165
А
Аноним
13 июня 2025 07:20 · публичный вопрос
А
Аноним

3) Исходные данные для Робота записаны в файле 18-0.xls в виде электронной таблицы прямоугольной формы. Робот может двигаться только вниз и вправо. Робот может брать монеты только…

Запрос пользователя

3) Исходные данные для Робота записаны в файле 18-0.xls в виде электронной таблицы прямоугольной формы. Робот может двигаться только вниз и вправо. Робот может брать монеты только с тех клеток, где количество монет нечётно. Если количество монет чётно, то Робот не берёт в этой клетке ни одной монеты. Определите максимальную и минимальную денежную сумму, которую может собрать Робот, пройдя из левой верхней клетки в правую нижнюю. В ответе укажите два числа – сначала максимальную сумму, затем минимальную.

Ответ нейросети
13 июня 2025 07:20

Давайте разберём задачу по частям и подробно разъясним, как её решить.

Задача:
Дана таблица из файла 18-0.xls, представляющая собой прямоугольную сетку. Робот начинает движение в верхней левой клетке и должен добраться до нижней правой клетки, двигаясь только вниз или вправо.

Основные условия:

  • Робот может брать монеты только из клеток с нечётным количеством монет.
  • В клетках с чётным количеством монет он не берёт ничего.
  • В каждой клетке указывается число монет.

Что нужно сделать:
Определить две величины:

  1. Максимальную сумму монет, которую можно собрать, пройдя из начала в конец.
  2. Минимальную сумму монет при том же условии.

Шаг 1. Распарсить входные данные

  • Открыть файл 18-0.xls и считать таблицу.
  • Каждая ячейка содержит число — число монет.

Шаг 2. Обработка данных

Понимать, что в клетке можно взять монеты только если число нечётное.

  • Для каждой клетки:
    • Если число нечётное — это потенциал для сбора монет, равный этому числу.
    • Если чётное — 0 монет, можно не учитывать как сумму.

^^^ Создадим для дальнейших вычислений массив, где в каждой cells[i][j] хранится либо число монет (если нечётное), либо 0.


Шаг 3. Решение: динамическое программирование

Используем идеи из классической задачи поиска путей с максимальной и минимальной суммой, при этом учитывая, что перемещение возможно только вниз и вправо.

Обозначим:

  • dpMax[i][j] — максимальная сумма монет на пути из (0,0) в (i,j).
  • dpMin[i][j] — минимальная сумма.

Инициализация:

  • dpMax[0][0] = стоимость в начальной клетке (если нечётное число, то оно; иначе 0).
  • dpMin[0][0] — аналогично.

Переходы:

Для каждой клетки (i, j):

  • dpMax[i][j] = max( dpMax[i-1][j], dpMax[i][j-1]) + стоимость в текущей клетке.
  • dpMin[i][j] = min( dpMin[i-1][j], dpMin[i][j-1]) + стоимость в текущей клетке.

Учитывать границы, чтобы не выйти за пределы массива.

Итог:

  • Макс. сумма — значение dpMax[n-1][m-1],
  • Мин. сумма — dpMin[n-1][m-1].

Шаг 4. Решение на практике

Ниже представлен примерный алгоритм, который можно реализовать при помощи, например, Excel VBA, Python + pandas, или другого языка программирования.

import pandas as pd

# Загрузить таблицу
data = pd.read_excel("18-0.xls", header=None)
rows = data.shape[0]
cols = data.shape[1]

# Обработать таблицу: оставить только нечётные числа или 0
costs = data.applymap(lambda x: x if x % 2 == 1 else 0)

# Инициализация массивов для DP
dpMax = [[float('-inf')] * cols for _ in range(rows)]
dpMin = [[float('inf')] * cols for _ in range(rows)]

# Начальная точка
dpMax[0][0] = costs.iloc[0,0]
dpMin[0][0] = costs.iloc[0,0]

# Заполнение таблиц
for i in range(rows):
    for j in range(cols):
        if i == 0 and j == 0:
            continue
        top_max = dpMax[i-1][j] if i > 0 else float('-inf')
        left_max = dpMax[i][j-1] if j > 0 else float('-inf')
        top_min = dpMin[i-1][j] if i > 0 else float('inf')
        left_min = dpMin[i][j-1] if j > 0 else float('inf')

        max_prev = max(top_max, left_max)
        min_prev = min(top_min, left_min)

        dpMax[i][j] = max_prev + costs.iloc[i,j] if max_prev != float('-inf') else costs.iloc[i,j]
        dpMin[i][j] = min_prev + costs.iloc[i,j] if min_prev != float('inf') else costs.iloc[i,j]

# Итоговые значения
max_sum = dpMax[rows-1][cols-1]
min_sum = dpMin[rows-1][cols-1]

Итог

Ответ:

  • Максимальная сумма монет: [значение max_sum]
  • Минимальная сумма монет: [значение min_sum]

(Замени эти placeholders на рассчитанные числа после обработки файла)


Если потребуется, я могу помочь с конкретной реализацией кода или объяснить шаги более подробно!