Трое лучших учеников
Créé le : 10 février 2025
Créé le : 10 février 2025
Трое лучших
Определите трех учащихся с наилучшим средним баллом по трем предметам. Выведите фамилии и имена этих учащихся. Если при этом у нескольких учащихся средний балл совпадает со средним баллом учащегося, "занявшего 3-е место", то необходимо вывести их всех.
Входные данные
Заданы сначала количество учащихся n, затем n строк, каждая из которых содержит фамилию, имя и три числа (оценки по трем предметам: математике, физике, информатике). Данные в строке разделены одним пробелом. Оценки принимают значение от 1 до 5.
Выходные данные
Необходимо вывести пары фамилия-имя по одной на строке, разделяя фамилию и имя одним пробелом. Выводить оценки не нужно. Порядок вывода должен быть таким же, как в исходных данных.
Сейчас напишу программу на Python, которая решает эту задачу.
python# Ввод количества учащихся n = int(input()) # Ввод информации об учащихся students = [] for _ in range(n): data = input().split() surname, name = data[0], data[1] grades = list(map(int, data[2:])) avg_grade = sum(grades) / len(grades) # Вычисление среднего балла students.append((surname, name, avg_grade)) # Сортировка по среднему баллу (по убыванию) students.sort(key=lambda x: x[2], reverse=True) # Определение порога среднего балла для 3-го места top_avg_grades = [student[2] for student in students] threshold = top_avg_grades[min(2, len(top_avg_grades) - 1)] # Средний балл для 3-го места # Вывод фамилии и имени учащихся, у которых средний балл не меньше порога for student in students: if student[2] >= threshold: print(student[0], student[1])
Входные данные:
text5 Иванов Иван 5 4 3 Петров Петр 4 4 4 Сидоров Сидор 5 5 5 Кузнецов Алексей 3 3 3 Смирнов Артем 4 5 4
Выходные данные:
textСидоров Сидор Иванов Иван Смирнов Артем
программа на python для решения задач на переливания с 2 сосудами
Задача о переливаниях воды между двумя сосудами – классическая задача, которую можно решить с помощью поиска в ширину (BFS) или поиска в глубину (DFS).
Даны два сосуда объемом A
и B
, изначально они пустые. Можно выполнять следующие операции:
Цель – получить заданный объем воды C
в одном из сосудов.
pythonfrom collections import deque def bfs(a, b, target): # Множество для хранения посещенных состояний visited = set() # Очередь для BFS (состояние представлено как (x, y), где x - вода в первом сосуде, y - во втором) queue = deque() # Начальное состояние (оба сосуда пустые) queue.append((0, 0)) while queue: x, y = queue.popleft() # Если достигли целевого объема if x == target or y == target: return True # Если уже посещали это состояние, пропускаем if (x, y) in visited: continue # Добавляем в посещенные состояния visited.add((x, y)) # Все возможные действия possible_moves = set() # Наполнить первый сосуд possible_moves.add((a, y)) # Наполнить второй сосуд possible_moves.add((x, b)) # Опустошить первый сосуд possible_moves.add((0, y)) # Опустошить второй сосуд possible_moves.add((x, 0)) # Перелить из первого во второй transfer = min(x, b - y) # Максимально возможное переливание possible_moves.add((x - transfer, y + transfer)) # Перелить из второго в первый transfer = min(y, a - x) possible_moves.add((x + transfer, y - transfer)) # Добавляем новые состояния в очередь for move in possible_moves: if move not in visited: queue.append(move) return False # Если не удалось достичь цели # Ввод параметров A = int(input("Введите объем первого сосуда: ")) B = int(input("Введите объем второго сосуда: ")) C = int(input("Введите целевой объем воды: ")) # Проверяем, можно ли получить требуемый объем if C > max(A, B): print("Невозможно получить данный объем воды.") elif bfs(A, B, C): print("Можно получить требуемый объем воды.") else: print("Невозможно получить данный объем воды.")
(x, y)
– это количество воды в первом и втором сосуде.C
, программа возвращает True.Вход:
textВведите объем первого сосуда: 4 Введите объем второго сосуда: 3 Введите целевой объем воды: 2
Выход:
Можно получить требуемый объем воды.
Этот алгоритм эффективно решает задачу и подходит для любых значений сосудов.