Работы учащихся Решение сложных задач по программированию | 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 г.