Execution Timed Out (Задача на CodeWars)
Выполняю задачу на CodeWars: Ребенок играет с мячом на n-м этаже высотного здания. Высота этого этажа h известна.
Он бросает мяч из окна. Мяч отскакивает (например) на две трети своей высоты (отскок 0,66).
Его мать смотрит из окна в 1,5 метрах от земли.
Сколько раз мать увидит, как мяч проходит перед ее окном (в том числе когда он падает и подпрыгивает?
Для достоверности эксперимента должны быть соблюдены три условия: Плавающий параметр "h" в метрах должен быть больше 0 Плавающий параметр "bounce" должен быть больше 0 и меньше 1 Плавающий параметр "окно" должен быть меньше h. Если все три условия выше выполнены, вернуть положительное целое число, иначе вернуть -1.
В IDE код работает без ошибок, как надо, и при тесте на CodeWars получаю положительный результат, но при финальной попытке запуска кода я получаю: Execution Timed Out (12000 ms) Даже предположить не могу, с чем это связано... Помогите, пожалуйста:3
public static int bouncingBall(double h, double bounce, double window)
{
if (h<0||window>h ||bounce < 0 || bounce > 1)
return -1;
int result = 0;
while (h>window)
{
result += (h > window) ? 1 : 0;
h = h * bounce;
result += (h > window) ? 1 : 0;
}
return result;
}
Ответы (1 шт):
Приведенный пример кода соответствует принятым решениям. Неизвестно, почему появляется ошибка при проверке.
В любом случае, для решения данной задачи можно вообще отказаться от цикла.
Рассмотрим высоты, на которые поднимается отскакивающий мяч.
Они образуют собой геометрическую прогрессию, в которой первый член равен h, и знаменателем прогрессии является bounce.
Таким образом, задачу можно свести к нахождению номера члена прогрессии, который будет меньше заданного числа.
n-ый член прогрессии может быть вычислен по формуле:
bn = b0 * qn
номер члена можно найти следующим образом:
n = logq(bn / b0);
Из-за того, что bn не задан, а задано число, большее его в результате получим дробный n между последним видимым и первым невидимым.
Округляем в большую сторону до целого и получаем искомое значение.
Каждому номеру, кроме первого, соответствует два момента, когда мяч виден, таким образом конечное решение будет
n*2 - 1