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

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

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

 

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

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

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

За­да­ние 22

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

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

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

Ре­ше­ние.

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

По­счи­та­ем время вы­пол­не­ния про­цес­сов В, не за­ви­ся­щих от про­цес­сов А. Для этого вве­дем в стол­бец D фор­му­лы для строк, в ко­то­рых про­цесс А равен 0. Это про­цес­сы 1, 2, 9 и 10. В ячей­ку D2 вве­дем =B2, в D3  — =B3, в D10  — =B10 и в D11  — =B11.

По­счи­та­ем время вы­пол­не­ния про­цес­сов, за­ви­ся­щих от од­но­го про­цес­са А. Это про­цес­сы 4, 5, 6, 8, 11, 12 и 16. В ячей­ку D5 вве­дем =B5+D4, где В5  — время про­цес­са В, а D4  — время про­цес­са, от ко­то­ро­го за­ви­сит про­цесс В. В D6  — =B6+D4, в D7  — =B7+D6, в D9  — =B9+D8, в D12  — =B12+D10, в D13  — =B13+D11 и D17  — =B17+D16.

По­счи­та­ем время вы­пол­не­ния про­цес­сов, за­ви­ся­щих от двух про­цес­сов А. Это про­цес­сы 3, 7, 14 и 15. В ячей­ку D4 вве­дем =B4+МАКС(D2;D3), где В4  — время про­цес­са В, а МАКС(D2;D3)  — мак­си­маль­ное время про­цес­сов, от ко­то­ро­го за­ви­сит про­цесс В (вы­би­ра­ем мак­си­маль­ное, так как про­цес­сы могут идти па­рал­лель­но). В D8  — =B8+МАКС(D5;D7), в D15  — =B15+МАКС(D4;D13) и в D16  — =B16+МАКС(D9;D14).

По­счи­та­ем время вы­пол­не­ния про­цес­сов, за­ви­ся­щих от трех про­цес­сов А. Это про­цесс 13. В ячей­ку D14 вве­дем =B14+МАКС(D8;D12;D13), где В14  — время про­цес­са В, а МАКС(D8;D12;D13)  — мак­си­маль­ное время про­цес­сов, от ко­то­ро­го за­ви­сит про­цесс В (вы­би­ра­ем мак­си­маль­ное, так как про­цес­сы могут идти па­рал­лель­но).

Най­дем мак­си­маль­ное время вы­пол­не­ния са­мо­го длин­но про­цес­са, введя фор­му­лу =МАКС(D2:D17), и по­лу­чим время вы­пол­не­ния всех про­цес­сов  — 37.

 

Ответ: 37.

 

При­ведём ре­ше­ние Ев­ге­ния Дж­об­са на языке Python.

# ско­пи­ру­ем со­дер­жи­мое таб­ли­цы в файл

# и про­чи­та­ем его.

# За­ме­ним точки с за­пя­той на про­бе­лы

file = open('22.txt').read().replace(';', ' ')

# пре­об­ра­зу­ем дан­ные в спи­сок строк из чисел

nums = [[int(x) for x in s.split()]

for s in file.split('\n')]

# со­зда­дим сло­варь вида

# №про­цес­са: (время вы­пол­не­ния, про­цес­сы)

pr = {c[0]:(c[1], c[2:]) for c in nums[:-1]}

# опре­де­лим функ­цию, ко­то­рая

# воз­вра­ща­ет время ра­бо­ты про­цес­са

# n - номер про­цес­са

def f(n):

# если номер равен 0, то время вы­пол­не­ния 0

# (на­ча­ло всех про­цес­сов)

if n == 0: return 0

# иначе мак­си­маль­ное время вы­пол­не­ния

# для всех преды­ду­щиъ про­цес­сов

# плюс время вы­пол­не­ния про­цес­са n

return max(f(x)

for x in pr[n][1]) + pr[n][0]

# на­хо­дим мак­си­маль­ное зна­че­ние

print(max(f(x) for x in pr))

 

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

Из файла сле­ду­ет уда­лить стро­ку за­го­лов­ков и раз­бить ячей­ки с пе­реч­ня­ми про­цес­сов, от ко­то­рых за­ви­сит дан­ный про­цесс, на от­дель­ные ячей­ки с по­мо­щью ма­сте­ра «Текст по столб­цам». Файл сле­ду­ет со­хра­нить в фор­ма­те txt.

 

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

f=open('22.txt')

res={'0':0}

for s in f:

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

res[n]=max([res[x] for x in ff])+int(t)

print(max(res.values()))

 

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

Из файла сле­ду­ет уда­лить стро­ку за­го­лов­ков и раз­бить ячей­ки с пе­реч­ня­ми про­цес­сов, от ко­то­рых за­ви­сит дан­ный про­цесс, на от­дель­ные ячей­ки с по­мо­щью ма­сте­ра «Текст по столб­цам». Файл сле­ду­ет со­хра­нить в фор­ма­те txt.

Источник: ЕГЭ по ин­фор­ма­ти­ке 06.04.2023. До­сроч­ная волна