Региональный этап олимпиады по информатике проводился для учеников 9–11-х классов. Все ученики участвовали в общем конкурсе. Каждый участник олимпиады мог набрать от 0 до 600 баллов. По положению об олимпиаде победители определяются следующим образом.
1.Определяются все участники, набравшие наибольшее среди всех участников количество баллов. Они объявляются кандидатами в победители.
2.Если число кандидатов составляет не более 25% всех участников олимпиады, все кандидаты считаются победителями.
3.Если кандидатов в победители более 25%, то рассматривается количество баллов, набранное кандидатами в победители. Если кандидаты набрали более 300 баллов, все они объявляются победителями. Если балл, набранный кандидатами, не превышает 300 баллов, победителем не признаётся никто.
Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например BorlandPascal 7.0), которая будет определять фамилию и имя лучшего участника, не ставшего победителем олимпиады. Если следующий за баллом победителей один и тот же балл набрали несколько человек или если победителей нет, а лучших участников несколько (в этом случае они же являются искомыми), то выдаётся только число искомых участников. Гарантируется, что искомые участники (участник) имеются.
На вход программе сначала подаётся число участников олимпиады N (N<10000). В каждой из следующих N строк находится результат одного из участников олимпиады в следующем формате:<Фамилия> <Имя> <класс> <баллы>, где <Фамилия> – строка, состоящая не более чем из 20 непробельных символов; <Имя> – строка, состоящая не более чем из 15 непробельных символов; <класс> – число от 9 до 11; <баллы> – целое число набранных участником баллов (от 0 до 600). <Фамилия> и <Имя>, <Имя> и <класс>, а также <класс> и <баллы> разделены одним пробелом.
Пример входной строки:
Иванов Пётр 10 275
Программа должна выводить через пробел фамилию и имя искомого участника или их число. Пример выходных данных:
Кузнецов Иван
Второй вариант выходных данных:
4
Объяснение
Для решения поставленной задачи, при вводе очередного значения будем выбирать и записывать имя и количество баллов. Сравниваем количество полученных баллов (point) с максимальным количеством (max_point). В конце цикла мы должны получить максимальные баллы (max_point), баллы лучшего участника (best_point), имя победителя (max_point_student), имя лучшего участника (best_point_student), количество победителей (max_point_student_count) и количество лучшего участника (best_point_student_count). Теперь, если количество потенциальных победителей (max_point_student_count) меньше или равно 25% от общего числа участников (N), то все кандидаты – победители, значит выводим имя лучшего участника или количество лучших участников. Если же победителей больше 25%, то сравниваем максимальный результат (max_point) и число 300. Если max_point > 300, то победители есть, значит выводим best_point_student или best_point_student_count. Если же max_point <= 300, то победителей нет и лучшим участником становится потенциальный победитель, в этом случае выводим max_point_student или max_point_student_count.
Показать примеры входных и выходных данных
Первый пример входных данных:
6
Иванов Петя 10 125
Семенов Семен 8 280
Губанов Гена 9 210
Петров Алексей 9 106
Лягушкина Марина 10 210
Анюткина Аня 9 210
Пример выходных данных для приведенных выше данных:
3
Второй пример входных данных:
6
Иванов Петя 10 300
Семенов Семен 8 310
Губанов Гена 9 310
Петров Алексей 9 310
Лягушкина Марина 10 310
Анюткина Аня 9 210
Пример выходных данных для приведенных выше данных:
Иванов Петя
Третий пример входных данных:
6
Иванов Петя 10 200
Семенов Семен 8 210
Губанов Гена 9 210
Петров Алексей 9 210
Лягушкина Марина 10 210
Анюткина Аня 9 100
Пример выходных данных для приведенных выше данных:
4
Решение на языке 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 75 76 77 78 79 80 81 82 |
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) and (name = '') 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_student_count <= 0.25 * N then if best_point_student_count = 1 then writeln(best_point_student) else writeln(best_point_student_count) else if max_point > 300 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 47 48 49 50 |
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_student_count <= 0.25 * N: if best_point_student_count == 1: print(best_point_student) else: print(best_point_student_count) else: if max_point > 300: 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) |
Похожие задачи: 8023