Решение Python Задача «Яша плавает в бассейне»

Условие

Яша плавал в бассейне размером N × M метров и устал.
В этот момент он обнаружил, что находится:

  • на расстоянии x метров от одного из длинных бортиков (не обязательно от ближайшего),
  • на расстоянии y метров от одного из коротких бортиков.

Какое минимальное расстояние должен проплыть Яша, чтобы выбраться на бортик?

Программа получает на вход числа N, M, x, y и должна вывести одно число — ответ.


Логика решения

Это задача не так проста как кажется, легко ошибиться из-за слов «длинный» и «короткий».

1) Сначала понимаем, какие бортики длинные, а какие короткие

Бассейн — прямоугольник. У него две стороны:

  • одна длиной N
  • другая длиной M

Но в условии не сказано, что N всегда больше M.
Значит, чтобы не ошибиться, надо сделать так:

  • длинная сторона = то, что больше (max(N, M))
  • короткая сторона = то, что меньше (min(N, M))

Мы назовём:

  • L — длинная сторона (большая)
  • S — короткая сторона (меньшая)

2) Что означает расстояние x

x — расстояние до длинного бортика.

Длинный бортик — это сторона длиной L.
Чтобы дойти (доплыть) до длинного бортика, мы двигаемся поперёк короткой стороны.
То есть расстояние x всегда “лежит” в пределах короткой стороны S.

До одного длинного бортика расстояние равно x,
а до противоположного — S - x.

Значит, до ближайшего длинного бортика будет меньшее из двух:

  • x
  • S - x

3) Что означает расстояние y

y — расстояние до короткого бортика.

Короткий бортик — это сторона длиной S.
Чтобы дойти до короткого бортика, мы двигаемся поперёк длинной стороны.
То есть расстояние y “лежит” в пределах длинной стороны L.

До одного короткого бортика расстояние равно y,
а до противоположного — L - y.

До ближайшего короткого бортика будет меньшее из:

  • y
  • L - y

4) Финальный шаг

Теперь у нас есть два расстояния:

  • до ближайшего длинного бортика
  • до ближайшего короткого бортика

Минимальное из них и будет ответом.


Решение на Python

N = int(input())
M = int(input())
x = int(input())
y = int(input())

# 1) Определяем длинную и короткую стороны
L = N
S = M
if M > N:
    L = M
    S = N

# 2) Расстояние до ближайшего длинного бортика
#    длинный бортик "связан" с короткой стороной S
d_long = x
if S - x < d_long:
    d_long = S - x

# 3) Расстояние до ближайшего короткого бортика
#    короткий бортик "связан" с длинной стороной L
d_short = y
if L - y < d_short:
    d_short = L - y

# 4) Берём минимальное расстояние
ans = d_long
if d_short < ans:
    ans = d_short

print(ans)

Пояснение, что происходит в коде

  1. Мы делаем так, чтобы:
  • L всегда было большим числом (длинная сторона),
  • S всегда было меньшим числом (короткая сторона).
  1. Потом считаем ближайший длинный бортик:
    берём x и S - x, выбираем меньшее через if.
  2. Потом считаем ближайший короткий бортик:
    берём y и L - y, выбираем меньшее через if.
  3. Сравниваем полученные два числа и выводим меньшее.

Почему раньше мог получаться отрицательный ответ

Если не определить, где L, а где S, можно случайно посчитать, например:

M - y, когда y вообще относится к другой стороне.

Тогда выражение может стать отрицательным, и ответ будет неправильный.


Главное правило для запоминания

  • x относится к расстоянию до длинного бортика,
    значит сравниваем x и S - x
  • y относится к расстоянию до короткого бортика,
    значит сравниваем y и L - y

Leave a Reply

Your email address will not be published. Required fields are marked *

*