Задание №22 ЕГЭ Информатика с ответом и решением
Ответ: 23
Условие
В файле содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Будем говорить, что процесс B зависит от процесса A, если для выполнения процесса B необходимы результаты выполнения процесса A. В этом случае процессы могут выполняться только последовательно.
Информация о процессах представлена в файле в виде таблицы. В первой строке таблицы указан идентификатор процесса (ID), во второй строке таблицы — время его выполнения в миллисекундах, в третьей строке перечислены с разделителем «;» ID процессов, от которых зависит данный процесс. Если процесс является независимым, то в таблице указано значение 0.
Определите минимальное время, через которое завершится выполнение всей совокупности процессов, при условии, что все независимые друг от друга процессы могут выполняться параллельно.
Типовой пример организации данных в файле:
| ID процесса B | Время выполнения процесса B (мс) | ID процесса(ов) A |
| 1 | 4 | 0 |
| 2 | 3 | 0 |
| 3 | 1 | 1;2 |
| 4 | 7 | 3 |
В данном случае независимые процессы 1 и 2 могут выполняться параллельно, при этом процесс 1 завершится через 4 мс, а процесс 2 — через 3 мс с момента старта. Процесс 3 может начаться только после завершения обоих процессов 1 и 2, то есть через 4 мс после старта. Он длится 1 мс и закончится через 4 + 1 = 5 мс после старта. Выполнение процесса 4 может начаться только после завершения процесса 3, то есть через 5 мс. Он длится 7 мс, так что минимальное время завершения всех процессов равно 5 + 7 = 12 мс.
Выполните задания, используя данные из файла ниже:
Подсказки — как подойти к решению
- Задача сводится к поиску критического пути: время окончания процесса = его собственное время выполнения + максимум времён окончания всех процессов, от которых он зависит. Простое сложение всех времён не подходит — параллельные ветви выполняются одновременно.
- Данные лежат в файле таблицей: идентификатор процесса, время выполнения в миллисекундах и через «;» идентификаторы процессов, от которых он зависит (0 — процесс независимый). Аккуратнее читать файл программой, а не глазами, и обрабатывать процессы от независимых к зависимым.
- Заполняй столбец «время окончания»: у независимых процессов он равен их длительности, у остальных — длительности плюс максимум по уже посчитанным предшественникам. Ответ — максимум по всей таблице, а не время процесса из последней строки и не сумма длительностей.
Решение
Отсортируем данные в таблице так, чтобы все независимые процессы оказались в начале таблицы и любой процесс был расположен после всех процессов, от которых он зависит. Также в таблицу добавим столбец «Время окончания процесса» и запишем туда длительности независимых процессов.
| A | B | C | D |
|---|---|---|---|
| ID процесса B | Время выполнения процесса B (мс) | ID процесса(ов) A | |
| 1 | 5 | 0 | 5 |
| 2 | 6 | 0 | 6 |
| 3 | 3 | 0 | 3 |
| 4 | 7 | 0 | 7 |
| 5 | 2 | 3 | |
| 6 | 9 | 2;4 | |
| 7 | 5 | 3;4 | |
| 8 | 2 | 0 | 2 |
| 9 | 7 | 4;5 | |
| 10 | 2 | 8 | |
| 11 | 7 | 0 | 7 |
| 12 | 3 | 4;7 | |
| 13 | 7 | 3;6 | |
| 14 | 3 | 7;9 | |
| 15 | 8 | 10;11 |
Далее рассчитаем время выполнения оставшихся процессов:
f(5) = 2 + f(3) = 2 + 3 = 5;
f(6) = 9 + max(f(2), f(4)) = 9 + 7 = 16;
f(7) = 5 + max(f(3), f(4)) = 5 + 7 = 12;
f(9) = 7 + max(f(4), f(5)) = 7 + 7 = 14;
f(10) = 2 + f(8) = 2 + 2 = 4;
f(12) = 3 + max(f(4), f(7)) = 3 + 12 = 15;
f(13) = 7 + max(f(3), f(6)) = 7 + 16 = 23;
f(14) = 3 + max(f(7), f(9)) = 3 + 14 = 17;
f(15) = 8 + max(f(10), f(11)) = 8 + 7 = 15.
| A | B | C | D |
|---|---|---|---|
| ID процесса B | Время выполнения процесса B (мс) | ID процесса(ов) A | |
| 1 | 5 | 0 | 5 |
| 2 | 6 | 0 | 6 |
| 3 | 3 | 0 | 3 |
| 4 | 7 | 0 | 7 |
| 5 | 2 | 3 | 5 |
| 6 | 9 | 2;4 | 16 |
| 7 | 5 | 3;4 | 12 |
| 8 | 2 | 0 | 2 |
| 9 | 7 | 4;5 | 14 |
| 10 | 2 | 8 | 4 |
| 11 | 7 | 0 | 7 |
| 12 | 3 | 4;7 | 15 |
| 13 | 7 | 3;6 | 23 |
| 14 | 3 | 7;9 | 17 |
| 15 | 8 | 10;11 | 15 |
Ответ: 23.
Приведём решение на языке Python.
def f(d):
if d[2] == [0]:
return d[1]
else:
maxx = 0
for i in d[2]:
if maxx < f(index[i - 1]):
maxx = f(index[i - 1])
return maxx + d[1]
from csv import reader
with open("22_4.csv") as F:
s = reader(F, delimiter=';', quotechar='"')
next(s)
index = []
for i in s:
index.append([int(i[0]), int(i[1]), list(map(int, str(i[2]).split(';')))])
for i in range(len(index)):
print(i + 1, f(index[i]))
Примечание.
Для считывания информации из файла необходимо конвертировать его из xlsx в csv.
Ответ: 23
Типичные ошибки
- Это сумма длительностей всех процессов, то есть последовательное выполнение. Задача требует учесть параллельность, поэтому складывать все времена неверно.
- Взято время завершения последнего по номеру процесса, хотя самая длинная цепочка заканчивается другим процессом. Ищи максимум по всем временам окончания.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №22 по информатике