Разбор
Обозначим через ожидаемое время, через которое можно выбраться из комнаты в безопасное место. Тогда это время выражается следующим образом:
где — время выхода в безопасное место, если выбрать - ую дверь. Очевидно, что , если . Если , то для того чтобы выбраться, нужно сначала потратить время на возвращение в комнату, а затам время на повторную попытку выхода. Таким образом, в этом случае .
В результате получаем линейное уравнение относительно . Построить и решить это уравнение можно за время , где — количество дверей.
Пример
Рассмотрим первый тест. Составим уравнение:
откуда или .
Реализация алгоритма
Решение линейного уравнения будем проводить следующим образом. Все слагаемые, содержащие множитель , перенесем влево, а их коэффициенты будем хранить в переменной . Все константы соберем справа и сохраним в переменной . Изначально установим и .
Читаем пар чисел и .
Если , то увеличиваем правую часть уравнения на величину .
Если , то в правой части уравнения появится слагаемое . В этом случае следует прибавить к правой части величину , а из левой вычесть .
left = 1.0; right = 0.0; scanf("%d",&n); for(j = 0; j < n; j++) { scanf("%lf %lf",&x, &p); if (x < 0.0) { left -= p; right += p * (-x); } else right += x * p; }
Получили уравнение . Если , то выбраться из комнаты невозможно (не существует двери, ведущей в безопасное место). В противном случае искомое время можно вычислить как .
if (left > 0.0) { res = right / left;
Выводим ответ. Переменной соответствует номер теста.
printf("Case %d: %.2lf\n",i,res); } else printf("Case %d: God! Save me\n",i);