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

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

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

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

 

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

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

ID про­цес­са (-ов) A
140
230
311; 2
473

За­да­ние 22

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

Ти­по­вой при­мер имеет ил­лю­стра­тив­ный ха­рак­тер. Для вы­пол­не­ния за­да­ния ис­поль­зуй­те дан­ные из при­ла­га­е­мо­го файла.

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

Ре­ше­ние.

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

Рас­счи­та­ем время вы­пол­не­ния про­цес­сов.

Про­цес­сы 1, 2 и 4 не за­ви­сят от дру­гих про­цес­сов.

f(1)  =  8;

f(2)  =  3;

f(4)  =  10;

f(3)  =  5 + max(f(1), f(2))  =  5 + 8  =  13;

f(5)  =  9 + max(f(3), f(4))  =  9 + 13  =  22;

f(6)  =  2 + f(3)  =  2 + 13  =  15;

f(7)  =  3 + f(5)  =  3 + 22  =  25;

f(8)  =  4 + f(5)  =  4 + 22  =  26;

f(9)  =  10 + f(8)  =  10 + 26  =  36;

f(10)  =  8 + f(7)  =  8 + 25  =  33;

f(11)  =  6 + max(f(6), f(7))  =  6 + 25  =  31;

f(12)  =  5 + f(11)  =  5 + 31  =  36;

f(13)  =  3 + f(11)  =  3 + 31  =  34;

f(14)  =  7 + f(11)  =  7 + 31  =  38;

f(15)  =  9 + max(f(12), f(13),f(14))  =  9 + 38  =  47.

f(16)  =  10 + max(f(9), f(10))  =  10 + 36  =  46.

 

ID про­цес­саВремя вы­пол­не­нияID про­цес­сов A   
180  8  
2303
351;213
410010
593;422
62315
73525
84526
910836
108733
1166;731
1251136
1331134
1471138
15912;13;1447
161010;946

 

Ответ: 47.

 

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

 

При­ведём ре­ше­ние Ми­ха­и­ла Глин­ско­го на языке Python.

f=open('1_22.txt')

sl={'0':0}

for s in f:

s=s.replace(';',' ')

s=s.replace('"',' ')

n,t,*fun=s.split()

sl[n]=max([sl[i] for i in fun])+int(t)

print(max(sl.values()))

 

При­ме­ча­ние.

Для счи­ты­ва­ния ин­фор­ма­ции из файла не­об­хо­ди­мо кон­вер­ти­ро­вать его из xlsx в txt и уда­лить первую стро­ку.

Источники: