Торговля вином в Герговии - оптимизация

У меня есть задание , сижу несколько часов, набросал три варианта (с тремя , двумя и одним циклом), на небольшие входные данные задача решается быстро, но в условиях сказанно что N может быть равно 100.000 чисел,даже с 30 тысячами чисел, при одном цикле, вычисления идут 30 секунд, помогите разобраться, потому что я сижу над этой задачей уже довольно долго.

Необходимо, сделать чтобы можно было ввести 100.000 чисел до 10 секунд времени.

Все покупают вино у других жителей города. Каждый день каждый житель решает, сколько вина он хочет купить или продать. Интересно, что спрос и предложение всегда одинаковы, так что каждый житель получает то, что хочет. Однако есть одна проблема: транспортировка вина из одного дома в другой приводит к работе. Поскольку все вина одинаково хороши, жителям Герговии все равно, с кем они торгуют, их интересует только продажа или покупка определенного количества вина.

Транспортировка одной бутылки вина из одного дома в соседний дом приводит к одной единице работы

def wine_trade_V4(n,numList):

    work = 0

    for i in range(n):
        for j in range(n):
            if numList[i] > 0:
                if numList[j] < 0:
                    idx = abs(numList.index(numList[j])-numList.index(numList[i]))
                    numList[j]+=numList[i]
                    work += numList[i] * idx
                    numList[i] = 0
        if numList == [0]*n:
            break

    return work

Ввод и вывод и задание


Ответы (1 шт):

Автор решения: vp_arth

У меня вот такое получилось:

def solution(a):
    result = 0
    for i in range(1, len(a)):
        a[i] += a[i-1]
        result += abs(a[i-1])

    return result

print(solution([5, -4, 1, -3, 1])) # 9
print(solution([-1000, -1000, -1000, 1000, 1000, 1000])) # 9000

Просто тащим бутылки (положительные и отрицательные) из дома в дом и считаем работу для этого необходимую(по модулю)


у меня не выходило, потому что я в range от 0 начинал, а не с 1.

Это не принципиально; вот вариант без мутации массива, с простым суммированием в переменную. Последняя сумма всё равно нулевая, по условию.

def solution(a):
    work = 0   # всего проделано работы
    total = 0  # бутылок сейчас в руках
    for w in a:
        total += w
        work += abs(total)

    return work
→ Ссылка