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

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

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

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

Задача 1#86441

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

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

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

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

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

Этот алгоритм применяется последовательно для размещения всех N деталей. Определите номер предпоследней детали, для которой будет определено её место на ленте транспортёра, и количество деталей, которые будут покрашены до неё.

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

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

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

Вложения к задаче
Показать ответ и решение
file = open(’26_9793.txt’)
count_details = int(file.readline())
array_details = []#список, в котором у нас будут все детали файла
for i in range(count_details):
    detail = list(map(int,file.readline().split()))
    if detail[0] > detail[1]:#если второе число меньше первого
        array_details.append((detail[1],’paint’,i+1))#то добавляем второе число, указываем,
        # что эту деталь отправим на покраску и передаём её номер
    else:#в ином случае
        array_details.append((detail[0],’grind’,i+1))#тогда добавляем первое число, указываем,
        #что эту деталь отправим на шлифовку и передаём её номер
array_details.sort()
lenta = [0]*count_details#симулируем ленту транспортёра
details = []#список, в котором у нас будут детали, которые мы положили на ленту
for detail in array_details:#проход по всевозможным деталям файла
    if detail[1] == ’grind’:#если эту деталь нужно отправить на шлифовку
        for i in range(len(lenta)):#то делаем перебор с начала ленты
            if lenta[i] == 0:#если эта ячейка свободна
                lenta[i] = 1#указываем, что она занята
                details.append(detail)
                break#сброс цикла для того, чтобы перейти к следующей детали
    else:#в ином случае
        for i in range(len(lenta)-1,-1,-1):#перебор с конца ленты
            if lenta[i] == 0:#если эта ячейка свободна
                lenta[i] = 1#указываем, что она занята
                details.append(detail)
                break#сброс цикла для того, чтобы перейти к следующей детали
#выводим номер, предпоследней детали, а также количество покрашенных деталей до этой детали
print(details[-2][2],len([x for x in details[:-2] if x[1] == ’paint’]))

Ответ: 798 508

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

Задача 2#86442

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

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

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

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

- из-за низкокачественных,безответственных сотрудников для каждой 5 детали определяется куда отправится деталь не по минимальному числу, а по максимальному.

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

Этот алгоритм применяется последовательно для размещения всех N деталей. Определите номер последней детали, отправленной на покраску, для которой будет определено её место на ленте транспортёра, затем количество деталей, назначенных на отшлифовку, расположенных на второй половине ленты.

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

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

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

Вложения к задаче
Показать ответ и решение
file = open(’26_4M__3whpp.txt’)
count_details = int(file.readline())
array_details = []
for i in range(count_details):
    detail = list(map(int,file.readline().split()))
    if (i + 1) % 5 == 0:#если номер детали кратен 5
        if detail[0] > detail[1]:#определяем куда пойдет деталь по максимальному числу
            array_details.append((detail[0],’grind’,i+1))
        else:
            array_details.append((detail[1], ’paint’, i + 1))
    else:#в ином случае, определяем куда пойдет деталь по минимальному числу
        if detail[0] > detail[1]:
            array_details.append((detail[1],’paint’,i+1))
        else:
            array_details.append((detail[0],’grind’,i+1))
array_details.sort()
details = []
lenta = [0]*count_details
for detail in array_details:
    if detail[1] == ’grind’:
        for i in range(len(lenta)):
            if lenta[i] == 0:
                lenta[i] = detail
                details.append(detail)
                break
    else:
        for i in range(len(lenta)-1,-1,-1):
            if lenta[i] == 0:
                lenta[i] = detail
                details.append(detail)
                break
second_chapter = lenta[count_details//2:]
print([x[2] for x in details if x[1] == ’paint’][-1])
print(len([x for x in second_chapter if x[1] == ’grind’]))

Ответ: 895 18

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

Задача 3#86443

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

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

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

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

Этот алгоритм применяется последовательно для размещения всех N деталей. Определите сколько деталей будет отшлифовано, и деталь с каким номером окажется на позиции с номером K на ленте транспортёра.

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

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

Вложения к задаче
Показать ответ и решение
file = open(’26_12933.txt’)
count_detail, position = map(int,file.readline().split())
array_detail = []
for i in range(count_detail):
    detail = list(map(int,file.readline().split()))
    if detail[0] > detail[1]:
        array_detail.append((detail[1],’paint’,i+1))
    else:
        array_detail.append((detail[0], ’grind’, i + 1))
array_detail.sort()
details = []
lenta = [0]*count_detail
for detail in array_detail:
    if detail[1] == ’grind’:
        for i in range(len(lenta)):
            if lenta[i] == 0:
                lenta[i] = detail[2]
                details.append(detail)
                break
    else:
        for i in range(len(lenta)-1,-1,-1):
            if lenta[i] == 0:
                lenta[i] = detail[2]
                details.append(detail)
                break
print(len([x for x in details if x[1] == ’grind’]), lenta[position - 1])

Ответ: 489 924

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

Задача 4#86444

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

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

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

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

Этот алгоритм применяется последовательно для размещения всех N деталей. Определите сколько деталей будет отшлифовано, и деталь с каким номером окажется на позиции с номером K на ленте транспортёра.

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

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

Вложения к задаче
Показать ответ и решение
file = open(’26_3M.txt’)
count_detail,position = map(int,file.readline().split())
array_details = []
for i in range(count_detail):
    detail = list(map(int,file.readline().split()))
    if detail[0] > detail[1]:
        array_details.append((detail[1],’paint’,i+1))
    else:
        array_details.append((detail[0], ’grind’, i + 1))
array_details.sort()
details = []
lenta = [0]*count_detail
for detail in array_details:
    if detail[1] == ’grind’:
        for i in range(len(lenta)):
            if lenta[i] == 0:
                lenta[i] = detail[2]
                details.append(detail)
                break
    else:
        for i in range(len(lenta)-1,-1,-1):
            if lenta[i] == 0:
                lenta[i] = detail[2]
                details.append(detail)
                break
count_grind = len([x for x in details if x[1] == ’grind’])
count_paint = len([x for x in details if x[1] == ’paint’])
print(abs(count_grind-count_paint),lenta[position - 1])

Ответ: 19 637

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

Задача 5#86445

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

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

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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
file = open(’26_1.txt’)
count_detail = int(file.readline())
array_detail = []
for i in range(count_detail):
    detail = list(map(int,file.readline().split()))
    if detail[0] > detail[1]:
        array_detail.append((detail[1],’paint’,i+1))
    else:
        array_detail.append((detail[0], ’grind’, i + 1))
array_detail.sort()
details = []
lenta = [0]*count_detail
for detail in array_detail:
    if detail[1] == ’grind’:
        for i in range(len(lenta)):
            if lenta[i] == 0:
                lenta[i] = 1
                details.append(detail)
                break
    else:
        for i in range(len(lenta)-1,-1,-1):
            if lenta[i] == 0:
                lenta[i] = 1
                details.append(detail)
                break
print(len([x for x in details if x[1] == ’grind’]),details[-1][2])

Ответ: 484 544

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

Задача 6#86446

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

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

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

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

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

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

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

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

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

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

Ответ: 277 164

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

Задача 7#86447

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

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

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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_3__3whrj.txt’)
n = int(f.readline())
a = [list(map(int, i.split())) for i in f]
t = []  # список для хранения времени, типа операции и номера на ленте для каждой детали
for i in range(n):
    if a[i][0] > a[i][1]:
        t.append([a[i][0], 1, i + 1])
    else:
        t.append([a[i][1], 2, i + 1])
t.sort()
lenta = []
line_start = []  # списки для хранения деталей, которые размещаются в начале
line_end = []  # списки для хранения деталей, которые размещаются в конце
for i in t:  # заполнение списков в зависимости от типа операции
    if i[1] == 1:
        line_start.append(i)
    else:
        line_end.append(i)
lenta = line_start + line_end[::-1]
print(lenta[167][0], sum(x[0] for x in line_end))

Ответ: 1123 616262

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

Задача 8#87933

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

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

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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_12.txt’)
n = int(f.readline())
a = [list(map(int,i.split())) for i in f]
t = [] #список для хранения времени, типа операции и порядкового номера каждой детали
for i in range(n):
    if a[i][0] > a[i][1]:
        t.append([a[i][0], 1, i]) #шлифовка
    else:
        t.append([a[i][1], 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])

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