Кратко: место описывается номером ряда и положением внутри ряда: слева/справа от прохода и у прохода/у окна. Дальше проверяем условия по приоритету.
Для места с номером n:
row = (n - 1) // 4 # номер ряда, считая с 0
p = (n - 1) % 4
side = p // 2 # 0 — левая сторона, 1 — правая
near_aisle = (p % 2 == 1)
Внутри ряда места идут так:
1 2 | 4 3
5 6 | 8 7
...
То есть p = 0,1,2,3 соответствуют:
левое окно, левый проход, правое окно, правый проход.
Проверки:
- Тот же ряд и одна сторона от прохода →
1. - Тот же ряд, разные стороны, оба места у прохода →
2. - Ряды соседние и одна сторона от прохода →
3. - Иначе →
4.
Алгоритм работает за O(1) и требует O(1) памяти.
import sys
def seat_info(n):
row = (n - 1) // 4
p = (n - 1) % 4
side = p // 2 # 0 — слева, 1 — справа
near_aisle = (p % 2 == 1)
return row, side, near_aisle
def main():
data = sys.stdin.read().split()
# Дополнительная проверка по фразе из условия
if len(data) != 2:
print("Malformed input")
return
try:
x, y = map(int, data)
except ValueError:
print("Malformed input")
return
if not (1 <= x <= 10**9 and 1 <= y <= 10**9 and x != y):
print("Malformed input")
return
rx, sx, ax = seat_info(x)
ry, sy, ay = seat_info(y)
if rx == ry and sx == sy:
print(1)
elif rx == ry and sx != sy and ax and ay:
print(2)
elif abs(rx - ry) == 1 and sx == sy:
print(3)
else:
print(4)
if __name__ == "__main__":
main()
Проверка примеров:1, 2 → 1;4, 2 → 2;1, 5 → 3;4, 7 → 3;7, 8 → 1.