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

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

Задача 1#87935

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

Входные данные. В первой строке входного файла находится натуральное число N — количество заявок на проведение мероприятий (натуральное число, не превыщающее 10000).

Следующие N строк содержат пары чисел, обозначающих время начала и время окончания мероприятия (каждое из чисел натуральное, не превосходящее 1440).

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

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

Переносим данные в Excel, удаляем первую строку файла. Переходим в раздел «Настраиваемая сортировка» и сортируем сначала по столбцу B, а затем – по столбцу А.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу:

=ЕСЛИ(A2>=C1;B2;C1)

и растянем её до конца таблицы.

В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу:

=ЕСЛИ(C2<>C1;D1+1;D1)

растянем её до конца таблицы.

Максимальное число в столбце D будет ответом на первый вопрос: количество мероприятий – 97.

Чтобы ответить на второй вопрос найдем строку, где проходит 49 мероприятие (то есть то, что в середине). Время начала 49-го мероприятия: 1040, время его окончания – 1055. Значит, его продолжительность 15.

Ответ: 97 15

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

Задача 2#87933

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

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

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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_8.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)
line_end = line_end[::-1]
print(len(line_start))
print(line_end[-1][2])

Ответ: 5042 5259

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

Задача 3#87931

Система наблюдения ежеминутно фиксирует вход и выход посетителей магазина (в минутах, прошедших от начала суток). Считается, что в моменты фиксации входа и выхода посетитель находится в магазине. Нулевая минута соответствует моменту открытия магазина, который работает 24 ч в сутки без перерыва. Менеджер магазина анализирует данные системы наблюдения за прошедшие сутки, и выявляет отрезки времени наибольшей длины, в течение которых число посетителей, находящихся в магазине, не изменялось. Далее менеджер выбирает пики посещаемости – промежутки времени, когда количество посетителей в магазине было наибольшим. Пиков посещаемости в течение суток может быть несколько.

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_6.txt’)
n = int(f.readline())
stat = [0] * 1441
for i in range(n):
    a, b = map(int, f.readline().split())
    for j in range(a, b + 1):
        stat[j] += 1
print(max(stat))
for i in range(1441):
    # 3716 - число посетителей в пик посещаемости
    if stat[i] != 3716:
        stat[i] = ’ ’
    else:
        stat[i] = ’1’
s = ’’.join(stat)
s = s.split()
print(len(s))

Ответ: 1 3716

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

Задача 4#87927

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

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

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

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

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

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

Откроем текстовый документ, скопируем его и перенесем в столбец А таблицы Excel. Первую строку таблицы можно удалить, она нам не понадобится.

Переходим в раздел «Данные», «Текст по столбцам» и разделим первый столбец на два по разделителю «пробел».

Выделим столбцы А и В, перейдем в раздел настраиваемая сортировка и отсортируем сначала столбец А по убыванию, затем столбец В по убыванию.

В ячейку C2 запишем формулу:

=ЕСЛИ(И(A2<>A1;A2=A3);B2;””)

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

Выделяем столбец С и видим, что сумма по нему равна 186886. Это будет первым ответом.

Спускаемся на самую нижнюю строчку нашего списка и ищем последнюю строку, имеющую в столбце С значение 95. Значит, это последний корж, который находится на верхнем ярусе пирамиды. В столбце А находим его диаметр, он равен 3. Это будет вторым ответом.

Ответ: 186886 3

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

Задача 5#87926

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

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

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

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

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

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

Откроем текстовый документ, скопируем его и перенесем в столбец А таблицы Excel. Первую строку таблицы можно удалить, она нам не понадобится.

Сортируем столбец А по убыванию. В ячейку B1 копируем значение из ячейки A1. В ячейку B2 вставляем формулу:

=ЕСЛИ(И(ОСТАТ(B1-A2;2)=0;B1-A2>2);A2;B1)

и растягиваем вниз до конца таблицы.

В ячейку C1 вставим 1. В ячейку C2 вставляем формулу:

=ЕСЛИ(B2<>B1;C1+1;C1)

и растягиваем вниз до конца таблицы.

В любую свободную ячейку записываем формулу: =МАКС(C:C). Получаем ответ на первый вопрос: 469.

последнее значение из столбца A, для которого меняется значение в столбцах B и C и будет ответом на второй вопрос: 4.

Ответ: 469 4

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

Задача 6#87925

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

а) размер стороны внешнего контейнера превышает размер стороны внутреннего на K  и более условных единиц.

б) цвета внешнего и внутреннего контейнеров различны. Группу вложенных друг в друга контейнеров называют блоком. Количество контейнеров в блоке может быть любым.

Каждый блок, независимо от количества и размера входящих в него контейнеров, а также каждый одиночный контейнер, не входящий в блоки, занимает при хранении одну складскую ячейку.

Определите минимальное количество ячеек, которые потребуются для хранения всех контейнеров, и количество контейнеров цвета А в блоке с максимальным количеством контейнеров. Если таких блоков несколько, выведите максимальное встреченное в них количество контейнеров цвета А.

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

В первой строке входного файла записано натуральное число N  (1 ≤ N ≤ 30000)  – количество контейнеров, натуральное число K  (1 ≤ K ≤ 1000)  – наименьшая допустимая разница размеров вложенных соседних контейнеров

Каждая из следующих N  строк содержит натуральное число, не превышающее 10000  – длину стороны очередного контейнера, и латинскую букву, обозначающую цвет этого контейнера.

Вложения к задаче
Показать ответ и решение
f = open(’26_dif_5.txt’)

n, k = map(int, f.readline().split())

containers = []
for s in f:
    size, color = s.split()
    containers.append([int(size), color])
# Сортируем по убыванию первого и возрастанию второго элемента.
# Сортировка по возрастанию второго элемента для того,
# чтобы в первую очередь рассматривались контейнеры A.
containers.sort(key=lambda x: (-x[0], x[1]))

# Количество собранных блоков
cnt = 0
# Количество контейнеров цвета А в максимальном блоке
color_A = 0
# Размер максимального блока
mx = 0

while len(containers) > 0:
    cnt += 1
    # Выбранные контейнеры
    chosen = [containers[0]]
    # Не выбранные контейнеры
    not_chosen = []
    # Количество контейнеров А
    A = 1 if containers[0][1] == ’A’ else 0
    for cont in range(1, len(containers)):
        size, color = containers[cont]
        # Если размер предыдущего отличается от размера текущего не менее чем на k
        # А также цвета различны
        if chosen[-1][0] - size >= k and chosen[-1][1] != color:
            chosen.append(containers[cont])
            if color == ’A’:
                A += 1
        else:
            not_chosen.append(containers[cont])

    if len(chosen) > mx:
        mx = len(chosen)
        color_A = A
    elif len(chosen) == mx:
                                                                                                  
                                                                                                  
        color_A = max(color_A, A)

    # Обновляем список, чтобы в нём не было выбранных уже контейнеров
    containers = list(not_chosen)

print(cnt, color_A)

Ответ: 1128 12

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

Задача 7#87922

В лесополосе осуществляется посадка деревьев. Причем саженцы высаживают рядами на одинаковом расстоянии.

Через какое-то время осуществляется аэросъемка, в результате которой определяется, какие саженцы прижились. Необходимо определить ряд с максимальным номером, в котором есть подряд ровно 2  неприжившихся саженца, при условии, что между ними, а также справа и слева от них саженцы прижились. При аэросъемке была совершена ошибка — одно и то же дерево могло быть снято дважды. В ответе запишите сначала наибольший номер ряда, затем наименьший номер из найденных 2  неприжившихся мест в этом ряду.

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

В первой строке входного файла находится число N  — количество сфотографированных саженцев (натуральное число, не превышающее 10000  ). Каждая из следующих N  строк содержит два натуральных числа, не превышающих 1000  : номер ряда и номер саженца.

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

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

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

Решение при помощи электронных таблиц:

Сначала перенесем данные из файла в Excel, скопировав и вставив с разделителем пробел, а также удалим первую строчку.

Настраиваемой сортировкой отсортируем в первую очередь по столбцу A  по возрастанию, во вторую - по столбцу B  по возрастанию.

PIC

PIC

Выделим полностью столбцы A  и B  , перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты, в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит деревья, которые были по ошибке сняты дважды).

В LibreOffice Calc необходимо также выделить оба столбца, применить фильтр и перейти в раздел Фильтр по условию -> Стандартный фильтр.

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

PIC

PIC

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

=ЕСЛИ(И(A1=A2;A2=A3;B2-B1=2;B3-B2=2);B1+1;0)

Условие A1 = A2;A2 = A3  обеспечивает попадание двух прижившихся саженцов в один ряд, B2 − B1 = 2;B3 − B2 = 2  - нахождение трёх прижившихся саженцев через одно свободное место друг от друга. Если условия выполнились - записываем в ячейку номер первого неприжившегося саженца из 2-х.

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

 

Программное решение:

f = open(’26_dif_2.txt’)

n = int(f.readline())

tr = [list(map(int, i.split())) for i in f]
tr.sort()

max_row = 0
min_place = 10 ** 10

for i in range(len(tr) - 2):
    if tr[i][0] == tr[i + 1][0] == tr[i + 2][0]:
        if tr[i + 1][1] - tr[i][1] == tr[i + 2][1] - tr[i + 1][1] == 2:
            if max_row == tr[i][0]:
                min_place = min(min_place, tr[i][1] + 1)
            else:
                min_place = tr[i][1] + 1
            max_row = tr[i][0]

print(max_row, min_place)

Ответ: 3421 5019

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

Задача 8#86447

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

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

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

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’26_3.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
print(lenta[167][0], sum(x[0] for x in line_end))

Ответ: 1123 616262

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

Задача 9#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[-1][2])
print(len(line_end))

Ответ: 277 87

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

Задача 10#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

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

Задача 11#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

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

Задача 12#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

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

Задача 13#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

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

Задача 14#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

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

Задача 15#86045

Аэропорту необходимо оптимизировать расписание вылетов самолетов. Для этого они получили список всех полетов с указанием времени вылета и времени прилета. Известно, что в небе одновременно может находиться только один самолет, поэтому необходимо составить наиболее оптимальное расписание, чтобы обеспечить максимальное количество вылетов. Если время прибытия одного рейса совпадает со временем вылета другого, то вылет может быть осуществлен без задержек по времени. Расписание составляется таким образом, что в первую очередь совершаются рейсы с минимальным временем прилёта.

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

В первой строке входного файла находятся два числа через пробел: число A - общая продолжительность рабочего дня аэропорта (натуральное число, не превышающее 109  ) и число B - количество запланированных рейсов (натуральное число, не превышающее   4
10  ). В следующих B строках находится по два числа через пробел. Первое число - время вылета рейса (натуральное число, не превышающее 109  ). Второе число - время прилета (натуральное число, не превышающее 109  ).

Найдите количество вылетов в расписании, а также суммарное время выполнения рейсов.

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

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

Решение при помощи электронных таблиц:

Сначала переносим данные в Excel, удалим первую строчку, а потом при помощи настраиваемой сортировки отсортируем в первую очередь по столбцу B - по возрастанию, а потом по столбцу А - по убыванию (чтобы рейсы длились как можно меньше). Нужно сортировать по времени окончания рейса, так как чем раньше один кончится, тем раньше сможет начаться следующий.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(A2>=C1;B2;C1)

Таким образом у нас в столбце C будет храниться время окончания последнего (на данный момент) рейса. Каждый новое вылет мы проверяем - может ли он начаться после предыдущего последнего, и если да - сохраняем уже новое время окончания, иначе дублируем старое.

В столбце D мы посчитаем количество прошедших рейсов. В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;D1+1;D1)

Если сменилось время окончания - увеличиваем счётчик, иначе дублируем предыдущий.

Прежде чем определять ответ необходимо удалить из таблицы все строчки, в которых в столбце B значение больше времени окончания работы аэропорта - это строчки начиная с номера 5907, так как в ней в столбце B значение 8424, что больше чем 8423 из условия.

Максимальное число в столбце D и будет количеством рейсов - 144.

В столбце E мы посчитаем длительность прошедших рейсов. В ячейку E1 запишем разницу между B1 и A1, а в ячейку E2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;E1+(B2-A2);E1)

Если поменялось время окончания - увеличиваем общую длительность, иначе дублируем предыдущую.

Общая длительность рейсов - 5130.

 

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

f = open(’7_26_conf.txt’)
dur, n = map(int, f.readline().split())

plains = [list(map(int, i.split())) for i in f]

# Сортируем по времени окончания, так как
# чем раньше один кончится, тем раньше сможет начаться следующий
plains.sort(key=lambda x: (x[1], -x[0]))


# Уберем все рейсы, кончающиеся после закрытия аэропорта
ind = len(plains)
for i in range(len(plains)):
    if plains[i][1] > dur:
        ind = i
        break

plains = plains[:ind]

# Время окончания последнего рейса
last_end = plains[0][1]
cnt = 1
sm = plains[0][1] - plains[0][0]

for start, end in plains:
    # Может начаться новое - начинаем, не может - добавляем в список возможных
    if start >= last_end:
        cnt += 1
        last_end = end
        # Увеличиваем время общей длительности
        sm += end - start

print(cnt, sm)

Ответ: 144 5130

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

Задача 16#86044

Входной файл содержит сведения о заявках на проведение мероприятий в конференц-зале. В каждой заявке указаны время начала и время окончания мероприятия (в минутах от начала суток). Если время начала одного мероприятия меньше времени окончания другого, то провести можно только одно из них. Если время окончания одного мероприятия совпадает со временем начала другого, то провести можно оба. Определите, какое максимальное количество мероприятий можно провести в конференц-зале и минимальное возможное суммарное время проведения всех мероприятий.

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

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

Следующие N строк содержат пары чисел, обозначающих время начала и время окончания мероприятия (каждое из чисел натуральное, не превосходящее 1440).

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

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

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

’’’
Идея решения:
В самом начале мы найдём максимальное количество мероприятий, которые мы можем совершить,
затем посчитаем суммарное количество минут проведения всех мероприятий.
Дело в том, что мы можем убрать какое-то мероприятие из расписания, взять какое-то другое и при этом получить
меньшее суммарное время.
Именно это мы и будем делать, убирать какое-то мероприятие, ставить в расписание новое,
 которое возможно провести при текущем расписании и считать кол-во минут.
’’’
file = open(’6_26_conf.txt’)
count_race = int(file.readline())
array_race = []
for i in file:
    temp = i.split()
    start,end = int(temp[0]),int(temp[1])
    # добавляем в список мероприятий время старта, конца, а также кол-во минут сколько событие будет идти
    array_race.append([start,end,end-start])
# отсортируем массив, в первую очередь, по возрастанию времени окончания,
# во вторую очередь, по времени длительности,
# нас интересуют именно самые короткие по длительности мероприятия для выстраивания самого
#  оптимального расписания, c точки зрения, количества мероприятий в расписании.
array_race.sort(key = lambda x:(x[1],x[2]))
#список мероприятий, который мы проведём, закладываем изначально первый элемент из array_races
races = [array_race[0]]
#поминутный график конференц-зала. 0 обозначена минута, которая является свободной,
# никакой мероприятие в эту минуту не проходит.
#1 - в данную минуту проводится какое-то мероприятие.
schedule = [0]*2000
#поскольку первое мероприятие мы изначально положили в races,
# то в schedule также нужно заполнить 1-ами время выполнения данного процесса, от старта до его окончания
schedule[races[0][0]:races[0][1]] = [1 for j in range(races[0][0],races[0][1])]
for race in array_race:#проход по всевозможным мероприятиях
#если время текущего мероприятия больше или равно тому, что поставили в расписание последним,
    if race[0] >= races[-1][1]:
        # то текущее мероприятие может быть добавлено в список мероприятий
        races.append(race)
        for time in range(race[0],race[1]):
            schedule[time] = 1# помечаем, что данные минуты заняты
’’’
В строках выше мы определили максимальное количество мероприятий. Теперь будем определять минимальное время.
’’’
ost_race = sorted([x for x in array_race if x not in races],key = lambda x:(x[2]))#список мероприятий,
                                                                                                  
                                                                                                  
# которое мы не взяли в расписание изначально
mn = 10**10
for i in range(len(races)):#проход по всевозможным мероприятий нашего изначального расписания
    ’’’
    В следующих 4-x строках мы делаем следующие операции:
    1. Создаём temp_races и temp_schedule, которые являются клонами изначального списка
    мероприятий и расписания
    2. Удаляем из них i-ый элемент. Для начала в расписании помечаем 0 время выполнения процесса,
    что мы собираемся удалить,  затем функцией pop удаляем его из списка мероприятий
    ’’’
    temp_races = races[:]
    temp_schedule = schedule[:]
    temp_schedule[temp_races[i][0]:temp_races[i][1]] = [0 for j in range(temp_races[i][0], temp_races[i][1])]
    temp_races.pop(i)
    for race in ost_race:#проходимся по рейсам, которые мы не взяли изначально
        if sum(temp_schedule[race[0]:race[1]]) == 0:#если в расписании ни одна минута не занята с момента
         #начала и по окончанию мероприятия
            temp_races.append(race)#то данное мероприятие можно добавить в новый список мероприятий
            for time in range(race[0], race[1]):
                temp_schedule[time] = 1#помечаем 1 минуты в новом расписании
    #если длина текущего списка >= 40, то есть мы удалили элемент и нашли вместо него другое, как минимум одно
    if len(temp_races) >= 40:
        mn = min(mn,sum(temp_schedule))#то считаем минимальное время выполнения всех мероприятий
print(len(races),mn)


Ответ: 40 837

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

Задача 17#86043

Аэропорту необходимо оптимизировать расписание вылетов самолетов. Для этого они получили список всех полетов с указанием времени вылета и времени прилета. Известно, что в небе одновременно может находиться только один самолет, поэтому необходимо составить наиболее оптимальное расписание, чтобы обеспечить максимальное количество вылетов. Если время прибытия одного рейса совпадает со временем вылета другого, то вылет может быть осуществлен без задержек по времени.

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

В первой строке входного файла находятся два числа через пробел: число A - общая продолжительность рабочего дня аэропорта (натуральное число, не превышающее 109  ) и число B - количество запланированных рейсов (натуральное число, не превышающее 104  ). В следующих B строках находится по два числа через пробел. Первое число - время вылета рейса (натуральное число, не превышающее   9
10  ). Второе число - время прилета (натуральное число, не превышающее 109  ).

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

В ответе укажите сначала найденное количество, а затем, через пробел, время простоя между последними двумя рейсами.

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

Решение при помощи электронных таблиц:

Сначала переносим данные в Excel, удалим первую строчку, а потом при помощи настраиваемой сортировки отсортируем в первую очередь по столбцу B, а потом по столбцу А - всё по возрастанию. Нужно сортировать по времени окончания рейса, так как чем раньше один кончится, тем раньше сможет начаться следующий.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(A2>=C1;B2;C1)

Таким образом у нас в столбце C будет храниться время окончания последнего (на данный момент) рейса. Каждый новое вылет мы проверяем - может ли он начаться после предыдущего последнего, и если да - сохраняем уже новое время окончания, иначе дублируем старое.

В столбце D мы посчитаем количество прошедших рейсов. В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;D1+1;D1)

Если сменилось время окончания - увеличиваем счётчик, иначе дублируем предыдущий.

Прежде чем определять ответ необходимо удалить из таблицы все строчки, в которых в столбце B значение больше времени окончания работы аэропорта - это строчки начиная с номера 6248, так как в ней в столбце B значение 8726, что больше чем 8725 из условия.

Максимальное число в столбце D и будет количеством рейсов - 154.

Максимальное возможное время вылета последнего самолёта найдём как наибольшее число из всех возможных времен вылета последнего - максимальное число из отрезка столбца A напротив максимального числа из столбца D - 154. Чтобы получить второй ответ, из времени начала последнего рейса вычтем время окончания предпоследнего: 8648 - 8628 = 20.

 

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

f = open(’5_26_conf.txt’)
dur, n = map(int, f.readline().split())

plains = [list(map(int, i.split())) for i in f]

# Сортируем по времени окончания, так как
# чем раньше один кончится, тем раньше сможет начаться следующий
plains.sort(key=lambda x: (x[1], x[0]))


# Уберем все рейсы, кончающиеся после закрытия аэропорта
ind = len(plains)
for i in range(len(plains)):
    if plains[i][1] > dur:
        ind = i
        break

plains = plains[:ind]

# Время окончания предпоследнего рейса
prev_end = 0
# Время окончания последнего рейса
last_end = plains[0][1]
# Все возможные времена начала последнего рейса
last_starts = [plains[0][0]]
cnt = 1

for start, end in plains:
    # Может начаться новое - начинаем, не может - добавляем в список возможных
    if start >= last_end:
        cnt += 1
        # Смещаем последнее в предпоследнее
        prev_end = last_end
        last_end = end
        # Обнуляем список с началами
        last_starts = [start]
    else:
        last_starts.append(start)

print(cnt, max(last_starts) - prev_end)

Ответ: 154 20

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

Задача 18#86042

Аэропорту необходимо оптимизировать расписание вылетов самолетов. Для этого они получили список всех полетов с указанием времени вылета и времени прилета. Известно, что в небе одновременно может находиться только один самолет, поэтому необходимо составить наиболее оптимальное расписание, чтобы обеспечить максимальное количество вылетов. Если время прибытия одного рейса совпадает со временем вылета другого, то вылет может быть осуществлен без задержек по времени.

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

В первой строке входного файла находятся два числа через пробел: число A - общая продолжительность рабочего дня аэропорта (натуральное число, не превышающее 109  ) и число B - количество запланированных рейсов (натуральное число, не превышающее 104  ). В следующих B строках находится по два числа через пробел. Первое число - время вылета рейса (натуральное число, не превышающее   9
10  ). Второе число - время прилета (натуральное число, не превышающее 109  ).

Найдите наибольшее возможное количество вылетов в расписании, а также время вылета последнего состоявшегося в этот день рейса.

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

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

Решение при помощи электронных таблиц:

Сначала переносим данные в Excel, удалим первую строчку, а потом при поvощи настраиваемой сортировки отсортируем в первую очередь по столбцу B, а потом по столбцу А - всё по возрастанию. Нужно сортировать по времени окончания рейса, так как чем раньше один кончится, тем раньше сможет начаться следующий.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(A2>=C1;B2;C1)

Таким образом у нас в столбце C будет храниться время окончания последнего (на данный момент) рейса. Каждый новое вылет мы проверяем - может ли он начаться после предыдущего последнего, и если да - сохраняем уже новое время окончания, иначе дублируем старое.

В столбце D мы посчитаем количество прошедших рейсов. В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;D1+1;D1)

Если сменилось время окончания - увеличиваем счётчик, иначе дублируем предыдущий.

Прежде чем определять ответ необходимо удалить из таблицы все строчки, в которых в столбце B значение больше времени окончания работы аэропорта - это строчки начиная с номера 4502, так как в ней в столбце B значение 8073, что больше чем 8071 из условия.

Максимальное число в столбце D и будет количеством рейсов - 135.

Максимальное возможное время вылета последнего самолёта найдём как наибольшее число из всех возможных времен вылета последнего - максимальное число из отрезка столбца A напротив максимального числа из столбца D - 135. Таким образом ответ - 7978.

 

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

f = open(’4_26_conf.txt’)
dur, n = map(int, f.readline().split())

plains = [list(map(int, i.split())) for i in f]

# Сортируем по времени окончания, так как
# чем раньше один кончится, тем раньше сможет начаться следующий
plains.sort(key=lambda x: (x[1], x[0]))


# Уберем все рейсы, кончающиеся после закрытия аэропорта
ind = len(plains)
for i in range(len(plains)):
    if plains[i][1] > dur:
        ind = i
        break

plains = plains[:ind]

# Время окончания последнего рейса
last_end = plains[0][1]
# Все возможные времена начала последнего рейса
last_starts = [plains[0][0]]
cnt = 1

for start, end in plains:
    # Может начаться новое - начинаем, не может - добавляем в список возможных
    if start >= last_end:
        cnt += 1
        last_end = end
        # Обнуляем список с началами
        last_starts = [start]
    else:
        last_starts.append(start)

print(cnt, max(last_starts))

Ответ: 135 7978

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

Задача 19#86041

Входной файл содержит сведения о заявках на проведение мероприятий в конференц-зале. В каждой заявке указаны время начала и время окончания мероприятия (в минутах от начала суток). Если время начала одного мероприятия меньше времени окончания другого, то провести можно только одно из них. Если время окончания одного мероприятия совпадает со временем начала другого, то провести можно оба. Определите, какое максимальное количество мероприятий можно провести в конференц-зале и минимальное возможное время начала последнего мероприятия.

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

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

Следующие N строк содержат пары чисел, обозначающих время начала и время окончания мероприятия (каждое из чисел натуральное, не превосходящее 1440).

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

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

Решение при помощи электронных таблиц:

Сначала переносим данные в Excel, удалим первую строчку, а потом при поvощи настраиваемой сортировки отсортируем в первую очередь по столбцу B, а потом по столбцу А - всё по возрастанию. Нужно сортировать по времени окончания мероприятия, так как чем раньше одно кончится, тем раньше сможет начаться следующее.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(A2>=C1;B2;C1)

Таким образом у нас в столбце C будет храниться время окончания последнего (на данный момент) мероприятия. Каждое новое мероприятие мы проверяем - может ли оно начаться после предыдущего последнего, и если да - сохраняем уже новое время окончания, иначе дублируем старое.

В столбце D мы посчитаем количество прошедших мероприятий. В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;D1+1;D1)

Если сменилось время окончания - увеличиваем счётчик, иначе дублируем предыдущий.

Максимальное число в столбце D и будет количеством мероприятий - 38.

Минимальное допустимое время начала последнего мероприятия найдём при помощи следующей формулы, в качестве диапазона выбрав отрезок столбца А напротив максимального числа в столбце C:

=МИНЕСЛИ(A903:A966;A903:A966;»="&C902)

 

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

f = open(’3_26_conf.txt’)
n = int(f.readline())

confs = [list(map(int, i.split())) for i in f]

# Сортируем по времени окончания, так как
# чем раньше одно кончится, тем раньше сможет начаться следующее
confs.sort(key=lambda x: (x[1], x[0]))

# Время окончания предпоследнего мероприятия
prev_end = 0
# Время окончания последнего мероприятия
last_end = confs[0][1]
# Все возможные времена начала последнего мероприятия
last_starts = [confs[0][0]]
cnt = 1

for start, end in confs:
    # Может начаться новое - начинаем, не может - добавляем в список возможных
    if start >= last_end:
        cnt += 1
        # Смещаем последнее в предпоследнее и обновляем последнее
        prev_end = last_end
        last_end = end
        # Обнуляем список с началами
        last_starts = [start]
    else:
        last_starts.append(start)

print(cnt, min([i for i in last_starts if i >= prev_end]))

Ответ: 38 1288

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

Задача 20#86040

Входной файл содержит сведения о заявках на проведение мероприятий в конференц-зале. В каждой заявке указаны время начала и время окончания мероприятия (в минутах от начала суток). Если время начала одного мероприятия меньше времени окончания другого, то провести можно только одно из них. Если время окончания одного мероприятия совпадает со временем начала другого, то провести можно оба. Определите, какое максимальное количество мероприятий можно провести в конференц-зале и каков при этом минимальный возможный перерыв между двумя последними мероприятиями.

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

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

Следующие N строк содержат пары чисел, обозначающих время начала и время окончания мероприятия (каждое из чисел натуральное, не превосходящее 1440).

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

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

Решение при помощи электронных таблиц:

Сначала переносим данные в Excel, удалим первую строчку, а потом при помощи настраиваемой сортировки отсортируем в первую очередь по столбцу B, а потом по столбцу А - всё по возрастанию. Нужно сортировать по времени окончания мероприятия, так как чем раньше одно кончится, тем раньше сможет начаться следующее.

В ячейку C1 запишем значение ячейки B1, в ячейку C2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(A2>=C1;B2;C1)

Таким образом у нас в столбце C будет храниться время окончания последнего (на данный момент) мероприятия. Каждое новое мероприятие мы проверяем - может ли оно начаться после предыдущего последнего, и если да - сохраняем уже новое время окончания, иначе дублируем старое.

В столбце D мы посчитаем количество прошедших мероприятий. В ячейку D1 запишем 1, а в ячейку D2 запишем следующую формулу и растянем её до конца таблицы:

=ЕСЛИ(C2<>C1;D1+1;D1)

Если сменилось время окончания - увеличиваем счётчик, иначе дублируем предыдущий.

Максимальное число в столбце D и будет количеством мероприятий - 38.

Последние два мероприятия необходимо просчитать отдельно, для этого в ячейку E845 - напротив первого возможного предпоследнего мероприятия, запишем следующую формулу:

=ЕСЛИ(A845>=$C$844;B845;99999)

С её помощью мы определили, может ли это мероприятие быть предпоследним, и если да - сохранили время его окончания. В ячейку F845 запишем следуюзщую формулу:

=МИНЕСЛИ(A846:A1000;A846:A1000;”>=”&E845)

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

=ABS(F845-E845)

Растянем эти три формулы до конца таблицы, и в ответ запишем минимальное значение из столбца G.

 

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

f = open(’2_26_conf.txt’)
n = int(f.readline())

confs = [list(map(int, i.split())) for i in f]

# Сортируем по времени окончания, так как
# чем раньше одно кончится, тем раньше сможет начаться следующее
confs.sort(key=lambda x: (x[1], x[0]))

# Время окончания последнего мероприятия
last_end = confs[0][1]
# Все возможные времена начала последнего мероприятия
program = [confs[0]]
cnt = 1

for conf in confs:
    start, end = conf
    # Может начаться новое - начинаем
    if start >= last_end:
        cnt += 1
        last_end = end
        program.append(conf)

# Время окончания пред-предпоследнего мероприятия
new_end = program[-3][1]
mn = 10 ** 10
# Цикл начиная со следующего после пред-предпоследнего
for conf in range(confs.index(program[-3]) + 1, len(confs)):
    start, end = confs[conf]
    # Если текущее может стать предпоследним
    if start >= new_end:
        # Все возможные варианты последнего для текущего предпоследнего
        variants = [i[0] for i in confs[conf + 1:] if i[0] >= end]
        # Если есть хоть один вариант - обновляем минимальную разность между
        # началом последнего и концом предпоследнего
        if variants:
            mn = min(mn, abs(min(variants) - end))

print(cnt, mn)

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