ALEXMATH

Информатика. ЕГЭ

Задания для подготовки

Задачи разных лет из реальных экзаменов, демо-вариантов, сборников задач и других источников

Перейти к заданиям

Задание 26. Информатика. ЕГЭ. Статград. Профиль. 12.05.2025-1

Просмотры: 839
Изменено: 18 мая 2025

В мастерской есть станок A и станок B. Для обработки детали требуется последовательно выполнить две операции: на станках A и В. Для каждой детали известны порядок операций и длительность каждой операции. В недельной технологической карте указаны время поступления детали в мастерскую на обработку в минутах от 00 ч. 00 мин. понедельника, длительность обработки на станке А и длительность обработки на станке B, а также какая операция выполняется первой. Гарантируется, что никакие две детали не поступают в мастерскую одновременно. Обработка новой детали на каждом станке может начинаться сразу по окончании обработки предыдущей детали. На перенос детали от станка A к станку B или, наоборот, от станка B к станку A дополнительное время не требуется (перенос уже учтён в длительности операций). Если станок свободен, то сразу начинается обработка очередной детали, если станок занят, то деталь попадает в соответствующую очередь. Если две детали поступают на станок одновременно, то первой в очередь попадает деталь, которая поступила в мастерскую раньше.

Входные данные

Первая строка входного файла содержит целое число \(N\) – общее количество деталей. Каждая из следующих \(N\) строк содержит три числа и букву A или B. Первое число – время поступления в мастерскую, второе число – длительность обработки на станке А, третье число – длительность обработки на станке B, буква показывает какая операция должна выполняться первой.

В ответе запишите два целых числа: сначала количество деталей, которые не сразу попали на обработку на станке A и были поставлены в очередь, затем время окончания обработки всех деталей на станке A (в минутах от 00ч. 00 мин. понедельника).

Пример входного файла

\(4\)
\(4 \, 3 \, 5 \, A\)
\(7 \, 4 \, 4 \, B\)
\(17 \, 2 \, 3 \, B\)
\(18 \, 6 \, 7 \, A\)

По этим данным детали будут обрабатываться в следующем порядке.
Первая деталь, станок А. 4 – 7 мин.
Первая деталь, станок B. 7 – 12 мин.
Вторая деталь, станок B. 12 – 16 мин. После ожидания.
Вторая деталь, станок A. 16 – 20 мин.
Третья деталь, станок B. 17 – 20 мин.
Четвёртая деталь, станок А. 20 – 26 мин. После ожидания.
Третья деталь, станок A. 26 – 28 мин. После ожидания.
Четвёртая деталь, станок B. 26 – 33 мин.
Станок А ожидали две детали. Обработка на станке А завершена в 28 мин.

Решение:

Python


fd = open('26.txt')
N = int(fd.readline())
details = []
for line in fd:
    sp = line.split()
    tmp = [int(x) for x in sp[:3]]
    details.append(tmp + [sp[3], 0] + [tmp[0]]) #доп 4-е поле, 0 - сколько раз обрабатывалась деталь
                                              # 5-е поле - время следующей обработки детали
details.sort()

fin_A, fin_B = 0, 0
q, set_A, set_B = [], set(), set()
det = details.pop(0)
cur_time = det[0]
if det[3] == 'A':
    fin_A = cur_time + det[1]
    det[3] = 'B'
    det[5] = cur_time + det[1]
else:
    fin_B = cur_time + det[2]
    det[3] = 'A'
    det[5] = cur_time + det[2]
det[4] += 1
q.append(det)

while details or q:
    if details:
        if (not q) or (q and  max(x[5] for x in q) >= details[0][0]):
            q.append(details.pop(0))
    q.sort(key= lambda x: (x[5], x[0]))
    #print(q)
    cur_time = q[0][5]
    if q[0][3] == 'A' and q[0][5] < fin_A:
        q[0][5] = fin_A
        cur_time = fin_A
        set_A.add(tuple(q[0]))
    elif q[0][3] == 'B' and q[0][5] < fin_B:
        q[0][5] = fin_B
        cur_time = fin_B
        set_B.add(tuple(q[0]))
    #print(cur_time)
    det_process = [x for x in q if x[5] == cur_time]
    det_process_A = [x for x in det_process if x[3] == 'A']
    det_process_B = [x for x in det_process if x[3] == 'B']

    if det_process_A:
        det = det_process_A.pop(0)
        q.remove(det)
        det[4] += 1
        det[3] = 'B'
        det[5] = cur_time + det[1]
        fin_A = det[5]
        #print('Деталь', det, 'станок А', 'время', cur_time, det[5])
        if det[4] < 2:
            q.append(det)
        for d in det_process_A:
            d[5] = cur_time + det[1]
            set_A.add(tuple(d))

    if det_process_B:
        det = det_process_B.pop(0)
        q.remove(det)
        det[4] += 1
        det[3] = 'A'
        det[5] = cur_time + det[2]
        fin_B = det[5]
        #print('Деталь', det, 'станок B', 'время', cur_time, det[5])
        if det[4] < 2:
            q.append(det)
        for d in det_process_B:
            d[5] = cur_time + det[2]
            set_B.add(tuple(d))
    #print(set_A, set_B)
print(len(set_A), fin_A)

Ответ: \(662 \,\, 10026\)

Обсуждение задания

Здесь пока нет ни одного комментария. Будьте первым!

kege1
kege2
kege3
Новый тренажёр-эмулятор
Станции КЕГЭ

Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене.

Новое видео

Методы решения задания 16 ЕГЭ по Информатике «Вычисление рекуррентных выражений»

Поддержать автора сайта!

Поддержите автора сайта, если материалы, размещённые здесь, оказались вам полезны.

Совершая донат, вы соглашаетесь с Условиями использования

Расписание пробников Статграда в 2026/27 учебном году