Работы учащихся Решение сложных задач по программированию | Page 5
© Иванов Дмитрий, МБОУ «Лицей № 2», г. Нижневартовск
Задача № 4
Имеется список учеников разных школ, сдававших экзамен по информатике, с указанием их фамилии,
имени, школы и набранного балла. Напишите эффективную по времени работы и по используемой
памяти программу (укажите используемую версию языка программирования, например, Borland
Pascal 7.0), которая будет определять двух учеников школы № 50, которые лучше всех сдали
информатику, и выводить на экран их фамилии и имена.
Если наибольший балл набрали более двух человек, нужно вывести только их количество. Если
наибольший балл набрал один человек, а следующий балл набрало несколько человек, нужно
вывести только фамилию и имя лучшего. Известно, что информатику сдавали не менее 5 учеников
школы № 50.
На вход программе в первой строке подается количество учеников списке N. В каждой из
последующих N строк находится информация в следующем формате:
<Фамилия> <Имя> <Школа> <Балл>
где <Фамилия> – строка, состоящая не более, чем из 20 символов без пробелов, <Имя> – строка,
состоящая не более, чем из 20 символов без пробелов, <Школа> – целое число от 1 до 99, <Балл> –
целое число от 1 до 100.
Пример входной строки:
Иванов Сергей 50 87
Пример выходных данных, когда найдено два лучших:
Иванов Сергей
Сергеев Иван
Если больше двух учеников набрали высший балл, то программа должна вывести их количество.
Пример вывода в этом случае:
8
Если высший балл набрал один человек, а следующий балл набрало несколько человек, то программа
должна вывести только фамилию и имя лучшего. Пример вывода в этом случае:
Иванов Сергей
Решение:
program zdavali;
var N,i,cor,x,er,max,max2,k,k2:integer;
s,z,maxP,maxP2:string;
begin
readln(N);
max:=0; max2:=0;k:=1; k2:=1;
for i:=1 to N do begin
readln(s);
z:=s;
delete(z,1,Pos(' ',z));
delete(z,1,Pos(' ',z));
cor:=pos(' ',z);
Val(copy(z,1,cor-1),x,er);
if x=50 then begin
delete(z,1,cor); Val(z,x,er);
if x>=max then if x>max then begin
max:=x; maxP:=s; k:=1;
end else k:=k+1
else if x>=max2 then if x>max2 then begin
max2:=x;maxP2:=s;k2:=1;
end
else k2:=k+1;
end;
end;
if k>1 then writeln(K)
else
if k2>1 then begin
z:=maxP; cor:=pos(' ',z);
delete(z,1,cor);er:=pos(' ',z);
delete(maxP,cor+er,length(maxP)-cor-er+1);
writeln(maxP);
end else begin
z:=maxP; cor:=pos(' ',z);
delete(z,1,cor); er:=pos(' ',z);
delete(maxP,cor+er,length(maxP)-cor-er+1);
writeln(maxP);
z:=maxP2; cor:=pos(' ',z);
delete(z,1,cor); er:=pos(' ',z);
delete(maxP2,cor+er,length(maxP2)-cor-er+1);
writeln(maxP2);
end;
end.
май, 2015 г.