Вот подробное решение задачи с объяснениями.
Цель и входные данные
- Обозначения: обычная лампочка стоит a рублей и потребляет x ватт-часов (Вт·ч) за час, энергосберегающая стоит b рублей и потребляет y ватт за час. Стоимость электроэнергии p копеек за 1 ватт-час.
- Необходимо найти минимальное целое число часов t, через которое покупка и эксплуатация энергосберегающей лампочки станет не дороже обычной.
Понимание единиц
- За t часов обычная лампочка потребляет x * t ватт-часов, стоит энергия: p копеек за каждый ватт-час, итого p * x * t копеек.
- Энергосберегающая за t часов потребляет y * t ватт-часов, итого p * y * t копеек.
- Покупка лампочек: обычная a рублей, энергосберегающая b рублей. Приведём к одной единице (копейкам): a * 100 копеек и b * 100 копеек.
Неравенство для окупаемости Энергосберегающая становится экономически выгодной, когда общие траты на неё меньше или равны общим затратам на обычную: b100 + pyt <= a100 + pxt
Приводим к простому виду
- Переносим члены с t в одну сторону: b100 - a100 <= p*(x - y)*t
- Заметим, что x > y (энергосберегающая потребляет меньше) и p > 0, поэтому p*(x - y) > 0.
- Отсюда получаем выражение для минимального t: t >= (b - a) * 100 / ( p * (x - y) )
Требуется целое число часов, поэтому берем ceil: t_min = ceil( (b - a) * 100 / ( p * (x - y) ) )
Условия задачи
- По условию a < b и x > y, поэтому числитель (b - a) * 100 > 0 и знаменатель p*(x-y) > 0. Так что ответ существует и больше нуля.
- Все входные значения ≤ 10^9, поэтому для вычислений удобно использовать 64-битные целые (например long long в C++, int64_t в C/C++, Python int и т. п.).
Пример Из условия: a = 20, x = 90, b = 120, y = 20, p = 5 t_min = ceil( (120-20) * 100 / (5 * (90-20)) ) = ceil( 100 * 100 / (5 * 70) ) = ceil( 10000 / 350 ) = 29 Это совпадает с примером в задаче.
Как реализовать решение (показано на C++ как один из вариантов)
- Используйте 64-битные целые числа.
- Вычисляйте numerator = (b - a) * 100
- Вычисляйте denominator = p * (x - y)
- Ответ: t = (numerator + denominator - 1) / denominator (целочисленное деление с потолком)
Пример кода (C++)
#include <bits/stdc++.h> using namespace std;
int main() { long long a, x, b, y, p; if (!(cin >> a >> x >> b >> y >> p)) return 0;
long long numerator = (b - a) * 100; // разницу в стоимости в копейках
long long denom = p * (x - y); // экономия на электроэнергии в копейках за час
// минимальные часы, округляем вверх
long long t = (numerator + denom - 1) / denom;
cout << t << "\n";
return 0;
}
Замечания
- Формула корректна при любых допустимых входных значениях, где a < b и x > y.
- ЧислаConveniently помещаются в 64-битные типы: numerator ≤ 1e11, denom ≤ 1e18, поэтому операция (numerator + denom - 1) безопасна в 64-битном типе.
- Если хотите добавить дополнительную защиту на случай необычных входов, можно проверить denom > 0 перед вычислениями и обработать ситуацию отдельно, но по условию это не требуется.
Итого Минимальные целые часы, через которые энергосберегающая лампочка окупится, равны t_min = ceil( (b - a) * 100 / ( p * (x - y) ) ), и в примере это 29 часов.