После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.
Районный методист решила выяснить номер школы, ученики которой набрали наибольший средний балл, с точностью до целых.
Программа должна вывести на экран номер такой школы и её средний балл.
Если наибольший средний балл набрало больше одной школы — вывести количество таких школ и средний балл. Всего школ не более ста, школы нумеруются последовательно, начиная с единицы.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов>
где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов,
<Имя> — строка, состоящая не более чем из 20 символов без пробелов,
<Номер школы> — целое число в диапазоне от 1 до 99,
<Количество баллов> — целое число в диапазоне от 1 до 100.
Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
Школа с лучшим средним баллом 10
Наибольший средний балл = 84
Другой вариант выходных данных:
Всего школ: 3
Наибольший средний балл = 78
ПАСКАЛЬ
var points, npupils, mean:array[1..100] of integer;
ch:char;
i,N, school,p,k, max:integer;
begin
for i:=1 to 100 do {обнуляем массивы}
begin
points[i]:= 0;
mean[i]:=0;
npupils[i]:=0;
end;
readln(N); {считали количество строк}
for i:=1 to N do {перебираем все входные строки}
begin
repeat
read(ch)
until ch=' ';{считана фамилия}
repeat
read(ch) until ch=' ';{считано имя}
readln(school,p); {считали номер школы и балл ученика}
points[school]:=points[school] + p; {накапиливаем балл учеников для расчёта среднего в дальнейшем}
npupils[school]:=npupils[school] + 1; {накапливаем количество учеников в школе}
end;
for i:=1 to 100 do {Вычисляем средний балл в каждой школе с точностью до целого}
begin
mean[i]:= points[i] div npupils[i];
end;
max:=-1;
for i:=1 to 100 do {Находим школы с наибольшим средним баллом и запоминаем их количество}
begin
if mean[i]>max then
begin
max:=mean[i];
k:=1;
end
else if mean[i]=max then
begin
k:=k+1;
end;
end;
if k > 1 then
begin
writeln('Всего школ:', k);
writeln('Наибольший средний балл =', max);
end
else
begin
writeln('Школа с лучшим средним баллом');
writeln('Наибольший средний балл =', max);
end;
end.
Приводим решение Валентина Добрингского на C++.
#include using namespace std; void main() { const int size = 99; struct base { int amount; int sum; }; base s[size]; int N = 0; int tmp=0; int count=0; int max=0; int j = 0; char surname[30]; name[20]; cin >> N; for (int i = 0; i < size; i++) { s[i].amount = 0; s[i].sum = 0; } for (int i = 0; i < N; i++) { cin >> surname >> name >> j >> tmp; s[j-1].amount++; s[j-1].sum = s[j-1].sum + tmp; } for (int i = 0; i < size; i++) { if (max < s[i].sum) { max = s[i].sum; count = 1; tmp = i; } if (max == s[i].sum) count++; } if (count == 1) cout<<"Nomer school: "< cout << "Kol-vo school: " << count << endl << "Sredniy ball: " << max / s[tmp].amount << endl; system("pause"); }

