Решение 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.
Значит, до ближайшего длинного бортика будет меньшее из двух:
xS - x
3) Что означает расстояние y
y — расстояние до короткого бортика.
Короткий бортик — это сторона длиной S.
Чтобы дойти до короткого бортика, мы двигаемся поперёк длинной стороны.
То есть расстояние y “лежит” в пределах длинной стороны L.
До одного короткого бортика расстояние равно y,
а до противоположного — L - y.
До ближайшего короткого бортика будет меньшее из:
yL - 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)
Пояснение, что происходит в коде
- Мы делаем так, чтобы:
Lвсегда было большим числом (длинная сторона),Sвсегда было меньшим числом (короткая сторона).
- Потом считаем ближайший длинный бортик:
берёмxиS - x, выбираем меньшее черезif. - Потом считаем ближайший короткий бортик:
берёмyиL - y, выбираем меньшее черезif. - Сравниваем полученные два числа и выводим меньшее.
Почему раньше мог получаться отрицательный ответ
Если не определить, где L, а где S, можно случайно посчитать, например:
M - y, когда y вообще относится к другой стороне.
Тогда выражение может стать отрицательным, и ответ будет неправильный.
Главное правило для запоминания
- x относится к расстоянию до длинного бортика,
значит сравниваемxиS - x - y относится к расстоянию до короткого бортика,
значит сравниваемyиL - y
Leave a Reply