Оптимизированные решения для моей домашней работы - PullRequest
5 голосов
/ 25 сентября 2011

Днем улитка ползет вверх по стене. После всего труда, который он выполняет в течение дня, он останавливается, чтобы отдохнуть ... но засыпает !! На следующее утро он просыпается и обнаруживает, что поскользнулся во время сна.

Если это происходит каждый день, сколько раз улитка будет ползти, чтобы покрыть n стен разной высоты?

Я написал функцию для подсчета количества крипов улитки, как показано ниже:

void count(int move_forward, int move_backward, int number_walls, int[] height)
    {
        int count = number_walls, diff = move_forward - move_backward;
        while (number_walls--)
            for (move_backward = move_forward; move_backward < height[number_walls]; move_backward += diff)
                count++;
    }

Работает нормально. Но я хотел знать, есть ли другой способ решения этой проблемы для дальнейшей оптимизации скорости программы.

1 Ответ

7 голосов
/ 25 сентября 2011

решение равно ((height-x)/(x-y))+1, петли не требуются.

Улитка должна подняться на: height-x, и это займет у нее ((height-x)/(x-y)) дней. Как только это там, ему требуется дополнительный день, чтобы подняться на оставшиеся х.

РЕДАКТИРОВАТЬ: , как упоминалось в комментариях, это решение решает проблему для каждой стены, вам нужно будет выполнить итерацию по вашему массиву heights и суммировать эти результаты, сохраняя, по крайней мере, внутренний цикл, делая его O (n), вместо O (n * h), где n - количество стен, а h - высота стен.

(*) примечание: вы можете сохранить напоминание для каждой стены [т.е. сколько улитка может продолжать идти после того, как он прошел эту стену], и вычесть ее из следующей стены, зависит от описания задачи ... Если улитка может проходить максимум одну стену в день, игнорируйте этот последний комментарий.

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