ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Сортировка, отбор и моделирование.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 52326 635
Решение.
Сохраним приложенный текстовый файл под именем data.txt. Первая строка задаёт параметры задачи; её нельзя считать обычной записью данных. В программе нумерация элементов списка начинается с нуля, а номера из условия сохраняются без сдвига.
Количество студентов N = 9964. На стипендию претендуют первые 9964 : 4 = 2491 мест общего рейтинга. По условию столько студентов без двоек обязательно есть.
Разделим записи по наличию оценки 2. Для сдавших сортируем по убыванию суммы четырёх оценок, при равенстве по возрастанию ID. Деление суммы на 4 для среднего не требуется: одинаковый положительный делитель сохраняет порядок и равенства.
Для не сдавших сортировка другая: количество двоек по возрастанию, затем ID по возрастанию. Сумма оценок в этой части не является дополнительным критерием. Искомый второй студент — первый в таком списке с тремя или четырьмя двойками, а не просто с любой двойкой.
Первый ответ берём из списка сдавших на позиции N : 4 − 1 при индексации с нуля. Второй находим последовательным просмотром отсортированного списка не сдавших. Две независимые сортировки точно воспроизводят две части рейтинга. Время O(N log N), память O(N).
Полная программа на Python:
with open("data.txt", encoding="utf-8-sig") as f:
n = int(f.readline())
students = [list(map(int, f.readline().split())) for _ in range(n)]
passed = [row for row in students if 2 not in row[1:]]
failed = [row for row in students if 2 in row[1:]]
passed.sort(key=lambda row: (-sum(row[1:]), row[0]))
failed.sort(key=lambda row: (row[1:].count(2), row[0]))
places = divmod(n, 4)[0]
first = passed[places - 1][0]
second = next(row[0] for row in failed if row[1:].count(2) > 2)
print(first, second)Проверка результата.
Последний стипендиат имеет ID 52326 и оценки 4, 5, 3, 5, сумма 17. Его место 2491. Первый студент с более чем двумя двойками имеет ID 635 и оценки 2, 2, 5, 2; двоек 3. При равенствах проверен порядок ID.
Ответ: 52326 635.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF7257B4.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.