Информатика. ЕГЭ
Задания для подготовки
Задачи разных лет из реальных экзаменов, демо-вариантов, сборников задач и других источников
Задание 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\)
Обсуждение задания
Здесь пока нет ни одного комментария. Будьте первым!


