Программа для подсчёта времени начала и конца работы
a = [0, 5, 6, 5, 7, 2, 3, 5, 7]
b = [[0], [0], [0], [1], [2], [2], [3, 4], [5], [6, 7]]
z = 0
for i in range(1, len(a)):
e = a[max(b[i])]
t = a[i] + a[max(b[i])]
if t > z:
z = t
if len(b[i]) > 1:
c = a[i] + z
print('№ работы:', i, 'Время начала работы:', e, 'Время окончания:', t)
Но почему-то кода дело доходит до двойных значений во втором массиве код работает не правильно. Не получается написать такой код который в трёх последних значениях использует максимальное значения времени окончания.
Ответы (1 шт):
Как-то так...
(если не экономить буквы и называть переменные осмысленными именами, то сразу становится понятнее)
job_time = [ 0, 5, 6, 5, 7, 2, 3, 5, 7 ]
jobs_required = [[0], [0], [0], [1], [2], [2], [3, 4], [5], [6, 7]]
end_time = [ 0 ]
for i in range(1, len(job_time)):
start_time = max(end_time[job] for job in jobs_required[i])
end_time.append(start_time + job_time[i])
print('№ работы:', i, 'Время начала работы:', start_time, 'Время окончания:', end_time[i])
Если не понятно что делает строка start_time = max(end_time[job] for job in jobs_required[i]), то её эквивалентом будет этот кусок кода:
max_end_time = 0
for job in jobs_required[i]:
if end_time[job] > max_end_time:
max_end_time = end_time[job]
start_time = max_end_time
Или такой код (который является более приближенным к тому, что делается в той строке), если использовать временный список для поиска максимума в нём:
times = []
for job in jobs_required[i]:
times.append(end_time[job])
start_time = max(times)
Ну, а (если вдруг не изучали ещё) строка вида что_то.append(что_то_другое) просто добавляет элемент что_то_другое в конец списка что_то.
Ещё как вариант, можно написать рекурсивную функцию, которая сразу будет выдавать время окончания i-той работы. Если нужно подсчитать только время конкретной работы, то можно через неё. Если нужны все времена, то через неё будет не оптимально.
def get_end_time(i):
return max(get_end_time(job) + job_time[i] for job in jobs_required[i]) if jobs_required[i][0] else job_time[i]
for i in range(1, len(job_time)):
end_time = get_end_time(i)
print('№ работы:', i, 'Время начала работы:', end_time - job_time[i], 'Время окончания:', end_time)
Результат:
№ работы: 1 Время начала работы: 0 Время окончания: 5
№ работы: 2 Время начала работы: 0 Время окончания: 6
№ работы: 3 Время начала работы: 5 Время окончания: 10
№ работы: 4 Время начала работы: 6 Время окончания: 13
№ работы: 5 Время начала работы: 6 Время окончания: 8
№ работы: 6 Время начала работы: 13 Время окончания: 16
№ работы: 7 Время начала работы: 8 Время окончания: 13
№ работы: 8 Время начала работы: 16 Время окончания: 23
