Как мне решить это: «Шаг вперед и назад проблема»? - PullRequest
0 голосов
/ 03 октября 2019

Постановка задачи:

Санджай зависим от алкоголя. Каждую ночь он пьет 4 бутылки водки. Он идет к себе домой. Сначала он делает шаг вперед (что составляет 5 м), но из-за того, что он пьян, после каждого его шага в прямом направлении его тело становится неуравновешенным, и он делает шаг назад (что составляет 3 м).

Каждыйшаг занимает 1 мин. Расстояние от бара до дома составляет n метров. Рассчитайте время, необходимое ему, чтобы добраться до его дома.

Формат ввода:

одна строка, содержащая одно целое число n.

Ограничения:

0 <= n < 10^18

Формат вывода

одно целое число, описывающее время, которое он потратил, чтобы добраться до дома.

from math import *
n = int(input())
x = 0
m = 0
n = n % 1000000007
n = n % 1000000007
while  x < n:
    x += 5
    m += 1
    if x >= n:
        break
    x -= 3
    m += 1
print(m)

Однако в последнем тесте ограничение по времени превышено, т. Е. Для n = 10 ^ 18 подобных чисел

Пример ввода 0

11

Пример вывода 0

7

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Попробуйте уменьшить проблему. Пусть time_taken(dist) будет функцией, которая говорит нам, сколько времени потребуется, чтобы добраться до дома. Тогда следующее удержание:

time_taken(1)  ==  1
time_taken(2)  ==  1
time_taken(3)  ==  1
time_taken(4)  ==  1
time_taken(5)  ==  1

time_taken(6)  ==  1 * 2 + time_taken(4)    (since 5-3 = 2)
               ==  1 * 2 + 1

time_taken(7)  ==  1 * 2 + time_taken(5)
               ==  1 * 2 + 1

time_taken(11) ==  1 * 2 + time_taken(9)
               ==  2 * 2 + time_taken(7)
               ==  3 * 2 + time_taken(5)
               ==  3 * 2 + 1

time_taken(26) ==  1 * 2 + time_taken(24)
               ==  2 * 2 + time_taken(22)
               ==  ...
               ==  11 * 2 + time_taken(4)
               ==  11 * 2 + 1

if n > 5:
time_taken(n)  ==  1 * 2 + time_taken(n - 2)
               ==  2 * 2 + time_taken(n - 4)
               ==  ...
               ==  (formula here) * 2 + time_taken(4 or 5)
0 голосов
/ 03 октября 2019

Время просто n / 2 * 2 Он продвигается на 2 метра каждый «цикл» 5 вперед 3 назад. Итак, мы видим, сколько «циклов» входит в n (n / 2m), это приведет к числу «циклов»Затем мы умножаем на количество времени, затрачиваемое на цикл (2 минуты), чтобы получить общее время (t = n / 2 * 2).

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