Тема 26. Обработка целочисленной информации с использованием сортировки

26.07 Детали на конвейерной ленте

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#87933

На производстве штучных изделий N деталей должны быть отшлифованы и окрашены. Для каждой детали известно время ее шлифовки и время окрашивания. Детали пронумерованы начиная с нуля. Параллельная обработка деталей не предусмотрена. На ленте транспортера имеется N мест для каждой из N деталей. На ленте транспортера детали располагают по следующему алгоритму:

– все 2N чисел, обозначающих время окрашивания и шлифовки для N деталей, упорядочивают по возрастанию;

– если максимальное число в этом упорядоченном списке – это время окрашивания конкретной детали, то деталь размещают на ленте транспортера на первое свободное место от ее начала;

– если максимальное число – это время шлифовки, то деталь размещают на первое свободное место от конца ленты транспортера;

– если число обозначает время окрашивания или шлифовки уже рассмотренной детали, то его не принимают во внимание.

Этот алгоритм применяется последовательно для размещения всех N деталей.

Определите сколько деталей будет окрашено и какой номер будет иметь последняя отшлифованная деталь.

Входные данные представлены в файле 26_12.txt следующим образом. Первая строка входного файла содержит натуральное число N (1 ≤ N ≤ 10000)  – количество деталей. Следующие N строк содержат пары чисел, обозначающих соответственно время шлифовки и время окрашивания конкретной детали (все числа натуральные, различные).

Запишите в ответе два натуральных числа через пробел: сначала количество деталей, которые будут окрашены, затем номер последней отшлифованной детали.

Вложения к задаче
Показать ответ и решение

Решение при помощи программы:

Считаем файл и переведём числа в удобный формат (int). Выполним все действия строго по условию. Обозначим цифрой (1 или 2), что мы будем делать с каждой деталью (после сравнения времени на оба действия). Запишем в список время, действие (1 - шлифовка, 2 - окраска) и номер. После обработки каждой детали перейдём к сортировке списка. Дело за малым - распределить деталь в начало или конец. Создадим два различных списка, которые будут хранить начало и конец ленты. Проверим, если у детали стоит цифра 2, то она должна быть окрашена и размещена в начале ленты. Если же цифра 1, то размещаем деталь в конце ленты, ведь она должна быть отшлифована. Выводим количество окрашенных деталей и номер последней отшлифованной детали (её крайне легко найти по индексу -1, номер мы ставили под индексом 2).

f = open("26_12.txt") # Откроем файл
n = int(f.readline()) # Считаем количество деталей отдельно
a = [list(map(int, i.split())) for i in f] # Считаем все остальные строки, переведём все числа в формат int при помощи map
t = [] # Cписок для хранения времени, типа операции и порядкового номера каждой детали
for i in range(n): # Пройдёмся по всем деталям
    if a[i][0] > a[i][1]: # Если время шлифовки больше времени окрашивания
        t.append([a[i][0], 1, i]) # Отправляем на шлифовку. Запишем время шлифовки, 1 будет обозначать шлифовку, i - номер детали
    else:
        t.append([a[i][1], 2, i]) # Отправляем на окрашивание. Запишем время окрашивания, 2 будет обозначать окрашивание, i - номер детали
t.sort() # Сортируем готовый список деталей
line_start = [] # Списки для хранения деталей, которые размещаются в начале
line_end = [] # Списки для хранения деталей, которые размещаются в конце
for i in t: # Заполнение списков в зависимости от типа операции
    if i[1] == 2: # Если деталь идёт на окрашивание - ставим её на первое свободное место от начала
        line_start.append(i)
    else: # Если деталь идёт на шлифовку - ставим её на первое свободное место от конца
        line_end.append(i)
print(len(line_start)) # Сколько деталей будет окрашено
print(line_end[-1][2]) # Выведем номер (индекс 0 - время, 1 - окрашивание или шлифовка, 2 - номер) последней (индекс -1) отшлифованной детали

Ответ: 451 646

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!