Во время сессии студенты сдают 4 экзамена, за каждый из которых можно получить от 2 до 5 баллов. Студенты, получившие хотя бы одну «двойку», считаются не сдавшими сессию. Результаты сессии публикуются в виде рейтингового списка, в котором сначала указаны идентификационные номера студентов (ID), сдавших сессию, в порядке убывания среднего балла за сессию, а в случае равенства средних баллов – в порядке возрастания ID. Затем располагаются ID студентов, не сдавших сессию: сначала – получивших одну «двойку», затем – две «двойки», потом ID студентов с тремя «двойками» и, наконец, ID студентов, получивших по 2 балла за каждый из экзаменов. Если студенты имеют одинаковое количество «двоек», то их ID в рейтинге располагаются в порядке возрастания.
Повышенную стипендию получают студенты, занявшие в рейтинговом списке первые 20% мест, при условии отсутствия у них «двоек». Гарантируется, что без «двоек» сессию сдали не менее 20% студентов.
Найдите ID первого в рейтинговом списке студента, не получившего повышенную стипендию, а также ID последнего в рейтинговом списке студента, который имеет одну «двойку».
В ответе запишите два целых положительных числа: сначала ID студента, который занимает первое место среди студентов не получивших повышенную стипендию, затем ID последнего в рейтинговом списке студента, который имеет одну «двойку».
Входные данные
В первой строке входного файла находится число , обозначающее количество студентов (целое положительное число, не превышающее 10 000). Каждая из следующих
строк содержит 5 чисел через пробел: ID студента (целое положительное число, не превышающее 100 000) и четыре оценки, полученные им за сессию. Гарантируется, что общее число студентов N кратно 5 и хотя бы один студент имеет одну «двойку». Во входном файле все ID различны.
Выходные данные
Два натуральных числа: искомые ID студентов в порядке, указанном в условии задачи.
Типовой пример организации данных во входном файле
10
4 4 4 4 4
7 5 5 5 2
10 3 4 4 5
1 4 4 4 3
6 3 5 5 3
2 2 2 2 2
13 2 2 2 3
3 3 3 3 3
5 2 4 5 3
15 2 3 3 3
При таких исходных данных рейтинговый список ID имеет вид: 4 6 10 1 3 5 7 15 13 2. Ответ: 10 15.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение с помощью электронных таблиц
Скопируем данные из файла в пустую таблицу. Разделим их по столбцам, для этого выделим столбец , перейдём во вкладку Данные, раздел «Текст по столбцам» и разделим наши данные, указав символом-разделителем пробел. Значение из первой строки (количество студентов) запишем в любом месте таблицы.
Озаглавим колонки, а также добавим еще 2 колонки: «Средний балл» и «Количество двоек», которые дальше пригодятся.
Заполним колонку «Средний балл», для этого в ячейку запишем формулу и растянем ее на все строки:
=СРЗНАЧ(B2:E2)
Колонку «Количество двоек» заполним с помощью формулы и так же растянем на все строки:
=СЧЁТЕСЛИ(B2:E2;”=2”)
Дальше сформируем рейтинговый список. Для этого выделяем столбцы и нажимаем на «Сортировка и фильтр»
«Пользовательская сортировка».
Первым параметром сортировки указываем «Количество двоек» – по возрастанию, вторым параметром «Средний балл» – по убыванию и третьим «ID» – по возрастанию. Однако, у студентов, не сдавших сессию, рейтинговый список формируется немного иначе – без учета параметра «Средний балл». Поэтому выделяем строки, содержащие студентов, не сдавших сессию, и применяем к ним фильтр снова, удалив этот параметр.
Таким образом мы сформировали рейтинговый список, остается найти в нем ответы на вопросы задачи.
Для ответа на первый вопрос – ID студента, который занимает первое место среди студентов не получивших повышенную стипендию, нужно сначала определить количество студентов получивших повышенную стипендию: . Тогда ID нужного студента находится в строке 1929. Первый ответ – 9429.
Для ответа на второй вопрос – ID последнего в рейтинговом списке студента, который имеет одну «двойку» отфильтруем данные. Для этого нажимаем «Сортировка и фильтр» «Фильтр», в колонке «Количество двоек» оставим только значение 1. В самой последней строке отфильтрованной таблицы будет значение искомого ID. Второй ответ – 9998.
Решение с помощью программы
Идея решения заключается в том, чтобы сохранять только нужные значения о нужных категориях студентов, а затем просто отфильтровать полученные массивы, чтобы найти в них нужные значения.
f = open("26_2.txt")
n = int(f.readline())
without_2 = [] # массив студентов, которые не получили двоек
with_one_2 = [] # массив студентов, у которых одна двойка
for i in f:
id, mark1, mark2, mark3, mark4 = map(int, i.split()) # считываем данные со строки файла
sr = (mark1 + mark2 + mark3 + mark4) / 4 # вычисляем средний балл
if [mark1, mark2, mark3, mark4].count(2) == 0: # если двоек нет
without_2.append([id, sr]) # сохраняем в массив студентов, которые не получили двоек
if [mark1, mark2, mark3, mark4].count(2) == 1:
with_one_2.append([id]) # сохраняем в массив студентов, у которых одна двойка
# остальных студентов сохранять не обязательно, так как они в любом случае
# будут ниже в рейтинге, а значит не нужны для ответов на вопросы
# сортируем массивы сначала по убыванию среднего балла, а затем по ID
sorted_without_2 = sorted(without_2, key=lambda x: (-x[1], x[0]))
sorted_with_one_2 = sorted(with_one_2, key=lambda x: (x[0]))
# вычисляем количество студентов, которые получили повышенную стипендию
proc = int(n * 0.2)
# выводим нужные данные
print(sorted_without_2[proc][0], sorted_with_one_2[-1][0])