Задания
Версия для печати и копирования в MS Word
Тип 22 № 47615
i

В файле со­дер­жит­ся ин­фор­ма­ция о со­во­куп­но­сти N вы­чис­ли­тель­ных про­цес­сов, ко­то­рые могут вы­пол­нять­ся па­рал­лель­но или по­сле­до­ва­тель­но. Будем го­во­рить, что про­цесс B за­ви­сит от про­цес­са A, если для вы­пол­не­ния про­цес­са B не­об­хо­ди­мы ре­зуль­та­ты вы­пол­не­ния про­цес­са A. В этом слу­чае про­цес­сы могут вы­пол­нять­ся толь­ко по­сле­до­ва­тель­но.

Ин­фор­ма­ция о про­цес­сах пред­став­ле­на в файле в виде таб­ли­цы. В пер­вой стро­ке таб­ли­цы ука­зан иден­ти­фи­ка­тор про­цес­са (ID), во вто­рой стро­ке таб­ли­цы  — время его вы­пол­не­ния в мил­ли­се­кун­дах, в тре­тьей стро­ке пе­ре­чис­ле­ны с раз­де­ли­те­лем «;» ID про­цес­сов, от ко­то­рых за­ви­сит дан­ный про­цесс. Если про­цесс яв­ля­ет­ся не­за­ви­си­мым, то в таб­ли­це ука­за­но зна­че­ние 0.

Опре­де­ли­те ми­ни­маль­ное время, через ко­то­рое за­вер­шит­ся вы­пол­не­ние всей со­во­куп­но­сти про­цес­сов, при усло­вии, что все не­за­ви­си­мые друг от друга про­цес­сы могут вы­пол­нять­ся па­рал­лель­но.

Ти­по­вой при­мер ор­га­ни­за­ции дан­ных в файле:

ID про­цес­са BВремя вы­пол­не­ния про­цес­са B (мс)ID про­цес­са(ов) A
1

40
230
311;2
473

 

В дан­ном слу­чае не­за­ви­си­мые про­цес­сы 1 и 2 могут вы­пол­нять­ся па­рал­лель­но, при этом про­цесс 1 за­вер­шит­ся через 4 мс, а про­цесс 2  — через 3 мс с мо­мен­та стар­та. Про­цесс 3 может на­чать­ся толь­ко после за­вер­ше­ния обоих про­цес­сов 1 и 2, то есть через 4 мс после стар­та. Он длит­ся 1 мс и за­кон­чит­ся через 4 + 1  =  5 мс после стар­та. Вы­пол­не­ние про­цес­са 4 может на­чать­ся толь­ко после за­вер­ше­ния про­цес­са 3, то есть через 5 мс. Он длит­ся 7 мс, так что ми­ни­маль­ное время за­вер­ше­ния всех про­цес­сов равно 5 + 7  =  12 мс.

За­да­ние 22

Спрятать решение

Ре­ше­ние.

От­сор­ти­ру­ем дан­ные в таб­ли­це так, чтобы все не­за­ви­си­мые про­цес­сы ока­за­лись в на­ча­ле таб­ли­цы и любой про­цесс был рас­по­ло­жен после всех про­цес­сов, от ко­то­рых он за­ви­сит. Также в таб­ли­цу до­ба­вим стол­бец «Время окон­ча­ния про­цес­са» и за­пи­шем туда дли­тель­но­сти не­за­ви­си­мых про­цес­сов.

 

ABCD
ID про­цес­са BВремя

вы­пол­не­ния

про­цес­са B (мс)

ID про­цес­са(ов) A
1505
241
331;2
452;3
5606
654;5
755;6
8909
967;8
1048;9
11808
12510;11
13711;12
14909
15513;14

 

Далее рас­счи­та­ем время вы­пол­не­ния остав­ших­ся про­цес­сов:

f(2) = 4 + f(1) = 4 + 5 = 9;

f(3) = 3 + max(f(1), f(2)) = 3 + 9 = 12;

f(4) = 5 + max(f(2), f(3)) = 5 + 12 = 17;

f(6) = 5 + max(f(4), f(5)) = 5 + 17 = 22;

f(7) = 5 + max(f(5), f(6)) = 5 + 22 = 27;

f(9) = 6 + max(f(7), f(8)) = 6 + 27 = 33;

f(10) = 4 + max(f(8), f(9)) = 4 + 33 = 37;

f(12) = 5 + max(f(10), f(11)) = 5 + 37 = 42;

f(13) = 7 + max(f(11), f(12)) = 7 + 42 = 49;

f(15) = 5 + max(f(13), f(14)) = 5 + 49 = 54.

 

ABCD
ID про­цес­са BВремя

вы­пол­не­ния

про­цес­са B (мс)

ID про­цес­са(ов) A
1505
2419
331;212
452;317
5606
654;522
755;627
8909
967;833
1048;937
11808
12510;1142
13711;1249
14909
15513;1454

 

Ответ: 54.

 

При­ведём ре­ше­ние на языке 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_34.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.