Последняя задача перед сдачей экзамена…
Условие
Дан список результатов сдачи экзамена учащимися школ некоторого района, с указанием фамилии и имени учащегося, номера школы и итогового балла. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая определяет номера школ, в которых больше всего учащихся получило за экзамен максимальный балл среди всех учащихся района.
На вход программе в первой строке подается количество учащихся во всех школах района N. В каждой из последующих N строк находится информация в следующем формате:
<Фамилия> <Имя> <Номер школы> <Балл>
где < Фамилия > — строка, состоящая не более, чем из 20 символов без пробелов, <Имя> — строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> — число от 1 до 99, <Балл> – число от 0 до 100. Порядок следования строк — произвольный.
Пример входных данных:
6
Иванов Сергей 7 74
Сергеев Петр 3 82
Петров Кирилл 7 85
Кириллов Егор 3 82
Егоров Николай 7 85
Николаев Иван 19 85
Программа должна вывести номера школ, из которых наибольшее количество учащихся получило на экзамене максимальный балл среди всех учащихся района. Пример вывода для приведенного выше примера ввода:
7
Примечание. В данном примере максимальный балл по району равен 85, его набрало 2 учащихся из школы 7 и 1 учащийся из школы 19, поэтому выводится только номер школы 7.
При выполнении задания следует учитывать, что значение N может быть велико (до 10.000).
Решение
#include <stdio.h> #include <string.h> const int MAX_SCHOOL = 100; struct info { int ppls, balls; }; int main() { int N; scanf("%d", &N); int school, balls, max_ball = 0, max_ppl = 0; info arr[MAX_SCHOOL]; memset(arr, 0, MAX_SCHOOL * sizeof(info)); for (int i = 0; i < N; i++) { scanf("%*s %*s %d %d", &school, &balls); // записываем в массив макимальное количество баллов в школе // и количество человек, получившее их if (balls == arr[school].balls) { arr[school].ppls++; } if (balls > arr[school].balls) { arr[school].balls = balls; arr[school].ppls = 1; } // определяем максимальное количество людей и баллов if (max_ppl < arr[school].ppls) { max_ppl = arr[school].ppls; } if (max_ball < balls) { max_ball = balls; } } // выводим for (int i = 0; i < MAX_SCHOOL; i++) { if (arr[i].ppls == max_ppl && arr[i].balls == max_ball) { printf("%d\n", i); } } return 0; }