Муниципальный этап олимпиады по информатике проводился для учеников 7–11-х классов. Все ученики участвовали в общем конкурсе. Каждый участник олимпиады мог набрать от 0 до 400 баллов. По положению об олимпиаде победителем признаётся участник, набравший наибольшее количество баллов, при условии, что им набрано больше половины возможных баллов. Победителей может быть несколько, если это количество баллов наберут несколько человек; а может и не быть совсем, если никто не наберёт больше половины.
Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например BorlandPascal 7.0), которая будет определять фамилию и имя лучшего участника, не ставшего победителем олимпиады. Если следующий за баллом победителей один и тот же балл набрали несколько человек или если победителей нет, а лучших участников несколько (в этом случае они же являются искомыми), то должно выдаваться только число искомых участников. Гарантируется, что искомые участники (участник) имеются.
На вход программе сначала подаётся число участников олимпиады N (N<10000). В каждой из следующих N строк находится результат одного из участников олимпиады в следующем формате: <Фамилия> <Имя> <класс> <баллы>, где <Фамилия> – строка, состоящая не более чем из 20 непробельных символов; <Имя> – строка, состоящая не более чем из 15 непробельных символов; <класс> – число от 7 до 11; <баллы> – целое число от 0 до 400 набранных участником баллов. <Фамилия> и <Имя>, <Имя> и <класс>, а также <класс> и <баллы> разделены одним пробелом. Пример входной строки:
Иванов Пётр 10 275
Программа должна выводить через пробел Фамилию и Имя искомого участника или их число. Пример выходных данных:
Кузнецов Иван
Второй вариант выходных данных:
4
Объяснение
Для решения поставленной задачи, при вводе очередного значения будем выбирать и записывать имя и количество баллов. Сравниваем количество полученных баллов (point) с максимальным количеством (max_point). В конце цикла мы должны получить максимальные баллы (max_point), баллы лучшего участника (best_point), имя победителя (max_point_student), имя лучшего участника (best_point_student), количество победителей (max_point_student_count) и количество лучшего участника (best_point_student_count). Теперь, если максимальные баллы больше 200, то выводим best_point_student, если он один, или best_point_student_count, если несколько. Если же максимальные баллы меньше или равны 200, то победителей нет и нам нужно вывести max_point_student или max_point_student_count, в зависимости от количества участников, набравших этот балл.
Примеры входных данных
Первый пример входных данных:
4
Иванов Петя 10 125
Семенов Семен 8 108
Губанов Гена 9 100
Петров Алексей 9 166
Пример выходных данных:
Петров Алексей
Еще один пример входных данных:
6
Иванов Петя 10 125
Семенов Семен 8 280
Губанов Гена 9 210
Петров Алексей 9 106
Лягушкина Марина 10 210
Анюткина Аня 9 210
Пример выходных данных:
3
Решение на языке Pascal
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
var N: word; //Количество участников point: word; //Очередные баллы участника name: string; //Имя участника max_point, best_point: word; //Максимальные и лучшие баллы max_point_student, best_point_student: string; //Имена учащихся, ставшего победителем и лучшим участником max_point_student_count, best_point_student_count: word; //Количество учащихся, набравших наибольшее количество баллов и меньшее количество баллов count: byte;//Вспомогательная переменная c :string; //Строка err: integer; //Вспомогательная переменная (для процедуры val) begin max_point := 0; best_point := 0; max_point_student_count := 1; best_point_student_count := 1; readln(N); for var i := 1 to N do begin count := 0; name := ''; readln(c); for var j:=1 to length(c) do begin if c[j] = ' ' then inc(count); if count = 2 then name := c[:j]; if count = 3 then begin val(c[j + 1:], point, err); break end; end; if point > max_point then begin best_point := max_point; max_point := point; best_point_student := max_point_student; max_point_student := name; best_point_student_count := max_point_student_count; max_point_student_count := 1; end else if point = max_point then inc(max_point_student_count) else if point > best_point then begin best_point := point; best_point_student := name; best_point_student_count := 1; end else if point = best_point then inc(best_point_student_count); end; if max_point > 200 then if best_point_student_count = 1 then writeln(best_point_student) else writeln(best_point_student_count) else if max_point_student_count = 1 then writeln(max_point_student) else writeln(max_point_student_count); end. |
Решение на языке Python
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
max_point = 0 best_point = 0 best_point_student = '' best_point_student_count = 1 max_point_student = '' max_point_student_count = 1 N = int(input()) for i in range(N): mas = list(map(str, input().split())) point = int(mas[3]) if point > max_point: best_point = max_point max_point = point best_point_student = max_point_student max_point_student = mas[0] + ' ' + mas[1] best_point_student_count = max_point_student_count max_point_student_count = 1 elif point == max_point: max_point_student_count += 1 elif point > best_point: best_point = point best_point_student = mas[0] + ' ' + mas[1] best_point_student_count = 1 elif point == best_point: best_point_student_count += 1 if max_point > 200: if best_point_student_count == 1: print(best_point_student) else: print(best_point_student_count) else: if max_point_student_count == 1: print(max_point_student) else: print(max_point_student_count) |
Похожие задачи: 8055