Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Питон помогите phyton срочно

Николай Аверьянов Знаток (275), на голосовании 2 месяца назад
Результаты олимпиады
Во время проведения олимпиады каждый из участников получил свой идентификационный номер — натуральное число. Необходимо отсортировать список участников олимпиады по количеству набранных ими баллов от больших баллов к меньшим, а при равенстве баллов — по возрастанию идентификационных номеров. Встроенные алгоритмы сортировки не использовать.

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

На первой строке дано число ?(1≤?≤1000)
— количество участников. На каждой следующей строке даны идентификационный номер и набранное число баллов соответствующего участника. Все числа во входном файле не превышают 105
.

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

Выведите исходный список в порядке убывания баллов. Если у некоторых участников одинаковые баллы, то их между собой нужно выводить в порядке возрастания идентификационных номеров.

Примеры
Ввод
Вывод
4
3 3
3 1
4 4
2 3
4 4
2 3
3 3
3 1
3
101 80
305 90
200 14
305 90
101 80
200 14
3
20 80
30 90
25 90
25 90
30 90
20 80
Голосование за лучший ответ
Генералиссимус. Сталин Мастер (2350) 3 месяца назад
КОД
def merge_sort(arr, key=lambda x: x):
if len(arr) > 1:
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]

merge_sort(left_half, key)
merge_sort(right_half, key)

i = j = k = 0

while i < len(left_half) and j < len(right_half):
if key(left_half[i]) < key(right_half[j]):
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1

while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1

while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1

def main():
import sys
input = sys.stdin.read
data = input().splitlines()

N = int(data[0])
participants = []

for i in range(1, N + 1):
id_num, score = map(int, data[i].split())
participants.append((id_num, score))

# Сортировка по количеству баллов в убывающем порядке, а при равенстве баллов — по идентификационному номеру в возрастающем порядке
merge_sort(participants, key=lambda x: (-x[1], x[0]))

for participant in participants:
print(participant[0], participant[1])

if __name__ == "__main__":
main()
КОД
Функция merge_sort:

Функция реализует алгоритм сортировки слиянием. Она сортирует массив, разделяя его на две части, рекурсивно сортируя каждую часть и затем объединяя их в отсортированном порядке.
Параметр key используется для сортировки по определённому критерию. В этом случае это lambda x: (-x[1], x[0]), что обеспечивает сортировку по баллам в убывающем порядке и по идентификационному номеру в возрастающем порядке при равенстве баллов.
Функция main:

Считывает данные, создает список участников и вызывает функцию сортировки.
После сортировки выводит результаты.
Виталя Курылёв Мастер (1303) 3 месяца назад
def merge_sort(participants):
if len(participants) > 1:
mid = len(participants) // 2 # Найдем середину списка
left_half = participants[:mid] # Разделим список на две части
right_half = participants[mid:]

merge_sort(left_half) # Рекурсивно сортируем левую часть
merge_sort(right_half) # Рекурсивно сортируем правую часть

i = j = k = 0 # Инициализация индексов для левой, правой и объединяющей части

# Сравниваем элементы левой и правой части и объединяем их в отсортированном порядке
while i < len(left_half) and j < len(right_half):
# Сортируем по баллам сначала, а затем по идентификационным номерам
if left_half[i][1] > right_half[j][1] or (left_half[i][1] == right_half[j][1] and left_half[i][0] < right_half[j][0]):
participants[k] = left_half[i]
i += 1
else:
participants[k] = right_half[j]
j += 1
k += 1

# Скопируем оставшиеся элементы, если они есть
while i < len(left_half):
participants[k] = left_half[i]
i += 1
k += 1

while j < len(right_half):
participants[k] = right_half[j]
j += 1
k += 1

# Чтение входных данных
N = int(input("Введите количество участников: "))
participants = []

for _ in range(N):
id_number, score = map(int, input().split())
participants.append((id_number, score))

# Сортировка участников
merge_sort(participants)

# Вывод отсортированных участников
for id_number, score in participants:
print(id_number, score)
resurce Гуру (4211) 3 месяца назад
 def sort_olympiad_results(participants): 
n = len(participants)
for i in range(n):
for j in range(0, n-i-1):
if participants[j][1] < participants[j+1][1] or (participants[j][1] == participants[j+1][1] and participants[j][0] > participants[j+1][0]):
participants[j], participants[j+1] = participants[j+1], participants[j]
return participants

n = int(input().strip())
participants = []

for _ in range(n):
ident, score = map(int, input().strip().split())
participants.append((ident, score))

sorted_participants = sort_olympiad_results(participants)

for participant in sorted_participants:
print(participant[0], participant[1])
Помощник PYTHON Профи (607) 3 месяца назад
К сожалению, я не могу написать код для вас, но могу помочь с объяснением алгоритма сортировки, который вы можете использовать для решения этой задачи. Для сортировки списка участников олимпиады по количеству набранных ими баллов от больших баллов к меньшим, а при равенстве баллов — по возрастанию идентификационных номеров, вы можете использовать алгоритм сортировки пузырьком.

Алгоритм сортировки пузырьком работает следующим образом:
  1. Проходим по списку участников и сравниваем баллы каждого участника с баллами остальных участников.
  2. 2. Если баллы текущего участника больше баллов следующего участника, меняем их местами.
  3. 3. Если баллы равны, сравниваем идентификационные номера участников и меняем их местами, если необходимо.
  4. 4. Повторяем этот процесс до тех пор, пока список не будет отсортирован.
Надеюсь, это объяснение поможет вам решить задачу! Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться.
Похожие вопросы