Задания
Версия для печати и копирования в MS Word
Тип 22 № 47605
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
1101
261
382
441;2
541;4
693
7303
873;5
955;8
10909
1191;5
1278;9
13808
1437
1585;9

 

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

f(2)  =  6 + f(1)  =  6 + 1  =  7;

f(3)  =  8 + f(2)  =  8 + 7  =  15;

f(4)  =  4 + max(f(1), f(2))  =  4 + 7  =  11;

f(5)  =  4 + max(f(1), f(4))  =  4 + 11  =  15;

f(6)  =  9 + f(3)  =  9 + 15  =  24;

f(8)  =  7 + max(f(3), f(5))  =  7 + 15  =  22;

f(9)  =  5 + max(f(5), f(8))  =  5 + 22  =  27;

f(11)  =  9 + max(f(1), f(5))  =  9 + 15  =  24;

f(12)  =  7 + max(f(8), f(9))  =  7 + 27  =  34;

f(14)  =  3 + f(7)  =  3 + 3  =  6;

f(15)  =  8 + max(f(5), f(9))  =  8 + 27  =  35.

 

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

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

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

ID про­цес­са(ов) A
1101
2617
38215
441;211
541;415
69324
7303
873;522
955;827
10909
1191;524
1278;934
13808
14376
1585;935

 

Ответ: 35.

 

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