Для поступления в вуз абитуриент должен предъявить результаты трех экзаменов в виде ЕГЭ, каждый из них оценивается целым числом от 0 до 100 баллов. При этом абитуриенты, набравшие менее 40 баллов (неудовлетворительную оценку) по любому экзамену из конкурса выбывают. Остальные абитуриенты участвуют в конкурсе по сумме баллов за три экзамена.
В конкурсе участвует N человек, при этом количество мест равно K. Определите проходной балл, то есть такое количество баллов, что количество участников, набравших столько или больше баллов не превосходит K, а при добавлении к ним абитуриентов, набравших наибольшее количество баллов среди непринятых абитуриентов, общее число принятых абитуриентов станет больше K.
Формат ввода
Программа получает на вход количество мест K. Далее идут строки с информацией об абитуриентах, каждая из которых состоит из имени (текстовая строка содержащая произвольное число пробелов) и трех чисел от 0 до 100, разделенных пробелами.
Используйте для ввода файл input.txt с указанием кодировки utf8.
Формат вывода
Программа должна вывести проходной балл в конкурсе. Выведенное значение должно быть минимальным баллом, который набрал абитуриент, прошедший по конкурсу.
Также возможны две ситуации, когда проходной балл не определен.
Если будут зачислены все абитуриенты, не имеющие неудовлетворительных оценок, программа должна вывести число 0.
Если количество абитуриентов, имеющих равный максимальный балл больше чем K, программа должна вывести число 1.
Используйте для вывода файл output.txt с указанием кодировки utf8.
Тест 1
Входные данные:
5
Иванов Сергей 70 70 70
Сергеев Петр 100 100 0
Петров Василий 70 60 70
Васильев Андрей 70 60 70
Андреев Денис 100 30 100
Денисов Роман 50 50 50
Романов Иван 60 70 70
Ким Чен Ир 50 50 50
Ким Ир Сен 40 40 40
Вывод программы:
200
Тест 2
Входные данные:
1
Иванов Сергей 40 40 40
Сергеев Петр 100 100 39
Вывод программы:
0
Тест 3
Входные данные:
1
Иванов Сергей 60 60 60
Сергеев Петр 100 40 40
Вывод программы:
1
Рабочее решение:
myFile = open("input.txt", "r", encoding="utf8") k = int(myFile.readline()) myList = [] for line in myFile: newLine = line.split() if int(newLine[-1]) >= 40 and int(newLine[-2]) >= 40 \ and int(newLine[-3]) >= 40: myList.append(newLine) myFile.close() myList.sort(key=lambda a: int(a[-1]) + int(a[-2]) + int(a[-3])) myList.reverse() konk = [] for i in myList: sum = int(i[-1]) + int(i[-2]) + int(i[-3]) konk.append(sum) n = len(konk) def konkurs(n, k, konk): if n <= k: return 0 elif konk[k] == konk[0]: return 1 for i in range(k, 0, -1): if konk[i] < konk[i - 1]: return konk[i - 1] print(konkurs(n, k, konk))
Мое решение, без реверса, т.е. цикл в функции считает в порядке возрастания индекса:
fileInput = open('input.txt', 'r', encoding='utf8') scoreList = [] k = int(fileInput.readline()) for line in fileInput: i = line.split() if int(i[-1]) >= 40 and int(i[-2]) >= 40 and int(i[-3]) >= 40: scoreList.append(int(i[-1]) + int(i[-2]) + int(i[-3])) fileInput.close() lenScoreList = len(scoreList) scoreList.sort() def minScore(n, k, sL): if n <= k: return 0 elif sL[-k] == sL[n + 1]: return 1 for i in range(-k, -1): if sL[i] < sL[i + 1]: return sL[i + 1] print(minScore(lenScoreList, k, scoreList))
Проблема: во втором решении, алгоритм цикла в функции, вроде, полностью противоположен решению № 1, но такой код проходит только 1-3 тесты. Я решил задачу иначе, с помощью кортежей в списке, но хотелось бы разобраться в этом варианте. Ах да, во втором варианте я не использовал метод ‘list.reverse()’.