Проблема эффективности - PullRequest
       3

Проблема эффективности

0 голосов
/ 20 сентября 2011

Я пытаюсь сделать мой алгоритм более эффективным, но по какой-то причине он работает неправильно, кто-то может сказать мне, если моя логика верна. Общая проблема заключается в том, что если у вас есть высота 'x', и вы можете прыгнуть на расстояние 'u', но вы упали на расстояние 'd', если вы еще не очистили высоту. Я должен рассчитать количество прыжков.

Исходный код работает правильно

while(x-u>0) {
    x=x-u+d;
    i++;
}
i++;

более эффективный код (по некоторым причинам в некоторых случаях происходит сбой, хотя я не знаю, в каких случаях)

int k=u-d;
if(x-u<=0){
    i++;
} else {
    int z=x/k;
    if (x-((z-1)*k)-u <= 0) {
        i+=z;
    } else {
        i=i+z+1;
    }
}

позвольте мне попытаться прояснить проблему, у вас есть стена высотой X, вы можете прыгнуть на расстояние U, но каждый раз, когда вы прыгаете, вы также проскальзываете на расстояние D. так скажем, если у вас есть стена высотой x = 4, u = 4, d = 1. Тогда вам придется прыгать только один раз, потому что при первом прыжке вы очистили стену, поэтому вы вообще не сползаете. Теперь давайте скажем, x = 6, u = 4, d = 1. Тогда вам придется прыгать дважды, потому что в первый раз вы прыгаете до 4, но падаете 1, поэтому вы находитесь на 3, а после следующего прыжка вы очищаете стену.

1 Ответ

4 голосов
/ 20 сентября 2011

Хорошо, посмотрим. последний прыжок происходит с высоты x - u или выше. Остальное вы должны покрыть шагами (u - d), количество таких шагов, конечно, (x - u)/(u - d).

После i -ого шага вы на высоте i * (u - d) + u (и падаете). Итак, ок. (x - u)/(u - d) ступеньки вы на высоте x - u + u = x. Вспоминая, что количество шагов должно быть целым числом, мы получаем окончательный результат:

if (u >= x)
    return 1;
if (u <= d)
    throw "Impossible";
return ceil((x - u)/(u - d));

(ceil - математическая функция, возвращающая наименьшее целое число не меньше заданного числа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...