Задание EGEINF4A2884: Сортировка, отбор и моделирование

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Сортировка, отбор и моделирование.

Учебные темы: Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве.

Впишите правильный ответ.

Рисунок из условия ФИПИ

Задание выполняется с использованием прилагаемых
файлов.

При онлайн-покупке билета на концерт известно, какие места в зале уже заняты. Необходимо купить билет на такое место в ряду, чтобы перед ним как можно больше идущих подряд кресел с таким же номером было свободно. Если места, удовлетворяющие этому условию, есть в нескольких рядах, то нужно выбрать ряд, расположенный как можно ближе к сцене. В ответе запишите два целых числа: искомый номер ряда и количество свободных кресел перед выбранным местом. Нумерация рядов и мест ведётся с 1. Гарантируется, что хотя бы одно такое место в зале есть.

 

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

В первой строке входного файла находятся три числа: N – количество занятых мест в зале (целое положительное число, не превышающее 10 000), M – количество рядов (целое положительное число, не превышающее 100 000) и K – количество мест в каждом ряду (целое положительное число, не превышающее 100 000). В следующих N строках находятся пары натуральных чисел: номер ряда и номер места занятого кресла соответственно (первое число не превышает значения M, а второе – K).

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

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

 

Типовой пример организации данных во входном файле

9 6 7

1 1

2 4

3 6

6 1

4 3

5 5

5 2

6 6

4 7

При таких исходных данных условию задачи удовлетворяют места (ряд, место): 5, 1; 4, 2; 6, 4; 4, 5. Перед этими местами три подряд кресла свободны. Ответом является пара чисел 4 и 3.

 

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.

 

Скачать файл задания (TXT, ФИПИ)


i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве
Тип ответа:Краткий ответ
Номер: 4A2884
НЕ РЕШЕНО Ответить

Решение задания EGEINF4A2884

Ответ: 68217 33508

Решение.

Сохраним приложенный текстовый файл под именем data.txt. Первая строка задаёт параметры задачи; её нельзя считать обычной записью данных. В программе нумерация элементов списка начинается с нуля, а номера из условия сохраняются без сдвига.

В файле N = 9996, M = 99931, K = 3332. Кресла перед выбранным местом имеют тот же номер места, поэтому каждую вертикальную колонку рассматриваем отдельно. Сам покупаемый билет должен соответствовать свободному креслу.

В список занятых рядов каждой колонки добавим условные границы 0 и M + 1. Между соседними границами a < b свободны все ряды a + 1…b − 1. Если b − a ≥ 2, лучший покупаемый ряд в этом промежутке равен b − 1: перед ним подряд свободны b − a − 2 кресла. Само покупаемое кресло в это количество не включаем.

Покупка в более раннем ряду того же промежутка уменьшает число свободных кресел перед ним. Поэтому достаточно проверить последние свободные кресла всех промежутков. Границы 0 и M + 1 учитывают начало и конец зала, в том числе полностью пустую колонку.

Сначала максимизируем количество свободных кресел впереди, затем минимизируем номер ряда. Вторым числом выводим найденное количество свободных кресел, а не номер места. Полнота следует из перебора всех свободных промежутков. Сложность O(N log N + K), память O(N + K).

Полная программа на Python:

with open("data.txt", encoding="utf-8-sig") as f:
    n, rows, seats = map(int, f.readline().split())
    occupied = [set() for _ in range(seats + 1)]
    for _ in range(n):
        r, s = map(int, f.readline().split())
        occupied[s].add(r)
best = None
for s in range(1, seats + 1):
    borders = [0] + sorted(occupied[s]) + [rows + 1]
    for a, b in zip(borders, borders[1:]):
        if b - a >= 2:
            candidate = (b - a - 2, -(b - 1), -s)
            if best is None or candidate > best:
                best = candidate
count, negative_row, negative_seat = best
print(-negative_row, count)

Проверка результата.

Оптимальная колонка имеет номер 620. Соседние занятые или условные граничные ряды: 34708 и 68218. Покупаемый ряд 68218 − 1 = 68217; перед ним свободны 68218 − 34708 − 2 = 33508 кресел подряд. Все остальные промежутки проверены тем же правилом.

Ответ: 68217 33508.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF4A2884.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

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