Форум » Обработка числовых последовательностей » На примере номера 6; Python.3 » Ответить

На примере номера 6; Python.3

mendez: Добрый день! Условие номера 6: [more] На вход программы подаются сведения о результатах соревнований по школьному многоборью. Многоборье состоит из соревнований по четырем видам спорта, участие в каждом из которых оценивается баллами от 0 до 10 (0 баллов получает ученик, не принимавший участия в соревнованиях по данному виду спорта). Победители определяются по наибольшей сумме набранных баллов. Известно, что общее количество участников соревнований не превосходит 100. В первой строке вводится количество учеников, принимавших участие в соревнованиях, N. Далее следуют N строк, имеющих следующий формат: <Фамилия> <Имя> <Баллы> Здесь <Фамилия> – строка, состоящая не более чем из 20 символов; <Имя> – строка, состоящая не более чем из 15 символов; <Баллы> - строка, содержащая четыре целых числа, разделенных пробелом, соответствующих баллам, полученным на соревнованиях по каждому из четырех видов спорта. При этом <Фамилия> и <Имя>, <Имя> и <Баллы> разделены одним пробелом. Примеры входных строк: Иванова Мария 5 8 6 3 Петров Сергей 9 9 5 7 Напишите программу, которая будет выводить на экран фамилии и имена трех лучших участников многоборья. Если среди остальных участников есть ученики, набравшие то же количество баллов, что и один из трех лучших, то их фамилии и имена также следует вывести. При этом имена и фамилии можно выводить в произвольном порядке.[/more] Актуальное решение, предложенное на языке Python на сайте: [quote]N = int(input()) res = {} for i in range(N): fam, name, b1, b2, b3, b4 = input().split() ball = [int(x) for x in [b1, b2, b3, b4]] res[fam+" "+name] = sum(ball) res = sorted(res.items(), key = lambda x: x[1], reverse = True) best = [x[0] for x in res if x[1] >= res[2][1]] for x in best: print(x)[/quote] Если ввести в качестве данных: 5 I K 5 4 5 5 I A 5 3 5 5 Y U 5 5 5 5 O P 5 4 5 5 T R 5 2 5 5, то этот код выдает: I K, Y U, O P ввиду best = [x[0] for x in res if x[1] >= res[2][1]], и это неверно, так как есть два ученика, претендующих на "второе место", и еще один на третье, который и оказывается не учтен. Если ввести в качестве данных: 5 I K 5 4 5 5 I A 5 3 5 5 Y U 5 5 5 5 I K 5 3 5 5 (измененная строчка) T R 5 2 5 5, то этот код выдает: Y U, I K, I A; видимо ввиду res[fam+" "+name] = sum(ball); это также неверно, так как есть два ученика с одинаковыми инициалами (I K), и один из них оказывается неучтен. Также и с другими аналогичными заданиями (например, с примером 2 к заданиям 27). Программа, которую написал я на Питоне, похожа на программу на Паскале в примере 2 к заданиям 27 и учитывает два случая выше: [quote]N=int(input()) mb1=0; mb2=0; mb3=0 attenders=[] for i in range(N): fam, name, a, b, c, d = input().split() abcd = [int(x) for x in [a,b,c,d]] abcd=sum(abcd) attenders.append([fam+' '+name, abcd]) if abcd==mb1 or abcd==mb2 or abcd==mb3: None elif abcd>mb1: mb3=mb2 mb2=mb1 mb1=abcd elif abcd>mb2: mb3 = mb2 mb2 = abcd elif abcd>mb3: mb3 = abcd for j in attenders: if j[1]>=mb3: print(j[0])[/quote] В связи с этим и вопрос: действительно ли неправильно решение, предложенное в ответе? правильно ли в свою очередь мое решение?

Ответов - 1

Поляков: mendez пишет: Если ввести в качестве данных: 5 I K 5 4 5 5 I A 5 3 5 5 Y U 5 5 5 5 O P 5 4 5 5 T R 5 2 5 5, то этот код выдает: I K, Y U, O P ввиду best = [x[0] for x in res if x[1] >= res[2][1]], и это неверно, так как есть два ученика, претендующих на "второе место", и еще один на третье, который и оказывается не учтен. Это правильно. В этой задаче требуется выявить трёх лучших, программа их и выводит. Если не согласны - доказывайте. это также неверно, так как есть два ученика с одинаковыми инициалами (I K), и один из них оказывается неучтен. Предполагается, что все пары "Фамилия-имя" различны. Иначе невозможно отличить одного ученика от другого (поля "идентификатор", которое могло бы спасти ситуацию, нет).



полная версия страницы