Условие
Склад находится в точке 0 прямой дороги. В посёлок x нужно доставить неделимый контейнер массы a, в посёлок y — контейнер массы b. Дрон за рейс перевозит не более m килограммов и пролетает не более d километров. Каждый рейс начинается и заканчивается на складе. Все контейнеры загружаются до вылета; дозагрузка и зарядка во время рейса запрещены, в том числе при пролёте через склад. Перед новым рейсом заряд восстанавливается. За рейс можно доставить один или оба контейнера. Найдите минимальное число рейсов или выведите −1, если доставка невозможна. Расстояние между u и v равно |u − v|.
Входные данные
Шесть целых чисел, каждое на отдельной строке: x, y, a, b, m, d. −5·10^8 ≤ x,y ≤ 5·10^8; x ≠ 0, y ≠ 0, x ≠ y; 1 ≤ a,b,m ≤ 10^9; 1 ≤ d ≤ 2·10^9.
Что вывести
Выведите одно целое число — ответ на задачу.
Как понимать условие
Контейнер нельзя разделить на части. Ограничение m относится к общей массе груза при вылете, а d — ко всему пути вместе с возвращением. Например, при x = 2, y = 5, a = 3, b = 4, m = 7 и d = 10 дрон берёт оба контейнера и летит 0 → 2 → 5 → 0. Масса равна 7, длина маршрута — 2 + 3 + 5 = 10. Ответ равен 1. Если посёлки окажутся по разные стороны склада, путь между ними станет длиннее.
Сколько вариантов нужно проверить
Контейнеров всего два. Ответ может быть −1, 1 или 2. Сначала выясним, можно ли доставить каждый контейнер отдельно: a ≤ m, b ≤ m, 2|x| ≤ d, 2|y| ≤ d.
Если хотя бы одно условие нарушено, ответ −1. Совместный рейс не поможет: дополнительный груз не уменьшает массу, а посещение второго посёлка не сокращает путь до первого и обратно.
Проверьте рассуждение
Посёлки находятся в −2 и 5, массы равны 3 и 4, m = 7, d = 10. Сколько рейсов нужно?
Длина совместного рейса
Маршрут 0 → x → y → 0 имеет длину |x| + |x − y| + |y|. Обратный порядок даёт ту же сумму. Для посёлков по одну сторону склада это удвоенная дальняя координата по модулю; по разные стороны — удвоенная сумма модулей.
Если a + b ≤ m и длина маршрута ≤ d, ответ 1. Иначе, после проверки отдельных доставок, ответ 2. Других вариантов разделения двух неделимых контейнеров нет. Время и память — O(1).
Почему нельзя зарядиться по дороге
При x < 0 < y маршрут проходит через склад, но условие запрещает зарядку и дозагрузку внутри рейса. В примере −2 и 5 общий маршрут имеет длину 14, хотя отдельным рейсам хватает 4 и 10 километров.
Сравнения включают равенство. Для сумм масс и длин в C++ нужен long long: сумма отдельных слагаемых может выйти за границу int.
Реализация на Python
x = int(input())
y = int(input())
a = int(input())
b = int(input())
m = int(input())
d = int(input())
if a > m or b > m or 2 * abs(x) > d or 2 * abs(y) > d:
print(-1)
elif a + b <= m and abs(x) + abs(x - y) + abs(y) <= d:
print(1)
else:
print(2)
Реализация на C++17
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
long long x,y,a,b,m,d; cin >> x >> y >> a >> b >> m >> d;
if (a>m || b>m || 2*abs(x)>d || 2*abs(y)>d) cout << -1;
else if (a+b<=m && abs(x)+abs(x-y)+abs(y)<=d) cout << 1;
else cout << 2;
}