Сайт Льва Волкова
  
Каждый день, в который вы не пополнили своего образования хотя бы маленьким, но новым для вас куском знания... считайте бесплодно и невозвратно для себя погибшим. К.С.Станиславский
 
      На главную  
 Личное
  Статьи
  Задачи 
 Ссылки
 АТ-531
www.levvol.ru    
 

Задача С4 из демоверсии ЕГЭ 2011 г

Дан список результатов сдачи экзамена учащимися школ некоторого района, с указанием фамилии и имени учащегося, номера школы и итогового балла.

Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например 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 может быть велико (до 10000).


Решение

Таблица. Имена переменных и их смысловое содержание
Имя переменной Тип Смысловое содержание
  r_t Запись: 2 поля
b -максимальный бал по школе, целое;
nb -число учеников школы, набравших максимальный балл, целое
x Массив 1 до 99 Записи типа r_t
n Целое Число учеников по району
с Символ Для ввода фамилии и имени
s Целое Номер школы ученика
bl Целое Балл полученный учеником
max Целое Макс. балл по району
maxnb Целое Максимальное число учеников по всем школам, получивших максимальный балл по району
i Целое Номера школ, параметр цикла

Вводим n - число учеников по району. Далее в цикле от 1 до n с помощью символа с вводим фамилию и имя ученика через пробел, по окончании ввода имени, вводим пробел. Фамилия и имя - нигде не запоминаются, ни в какой переменной.

Далее через пробел вводим номер школы ученика (s) и полученный им балл (bl).

Применяем алгоритм поиска максимального балла по всем вводимым данным (max).

Используем алгоритм нахождения для каждой школы (s) максимального балла (x[s].b) и числа сколько раз он встречается у учеников данной школы (x[s].nb).

По завершении цикла ввода в цикле от 1 до 99 (номера школ) находим максимальное значение количества учеников (maxnb), набравших максимальный балл по району (max).

Еще раз просматриваем все школы от 1 до 99 печатаем номера тех из них, в которых число учеников x[i].nb, набравших максимальный балл по школе x[i].b равняется maxnb и x[i].b=max.


Program C4_2011;
Uses CRT;
Type r_t=record
b,nb:integer;
end;
Var x:array[1..99] of r_t;
n,max,s,bl,maxnb,i:integer;
c:char;
Begin
ClrScr;
readln(n); {число учеников}
max:=0;
for i:=1 to n do begin {цикл ввода}
repeat {ввод фамилии}
c:=readkey;
write(c);
until (c=' ');
repeat {ввод имени }
c:=readkey;
write(c);
until (c=' ');
readln(s,bl); {ввод номера школы и балла}
if bl>max then max:=bl;{макс.балл по району}
{макс.балл по школе и число учеников его набравших}
if bl>x[s].b then begin
x[s].b:=bl;
x[s].nb:=0;
end;
if bl=x[s].b then x[s].nb:=x[s].nb+1;
{--------------------------------------------}
end; {конец цикла ввода}
maxnb:=0;
{макс. число учеников, набравших макс.балл по району}
for i:=1 to 99 do
if (x[i].b=max) and (x[i].nb>maxnb) then maxnb:=x[i].nb;
{вывод номеров школ с макс.числом учеников, набравших
макс балл по району}

for i:=1 to 99 do
if (x[i].nb=maxnb) and (x[i].b=max) then
writeln(i);
readln
End.

Скачать эту программу


Назад