Задача №10.
На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Инициалы> – строка, состоящая из 4-х символов (буква, точка, буква, точка), <номер школы> – не более чем двузначный номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы> разделены одним пробелом. Пример входной строки:
Иванов П.С. 57На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Инициалы> – строка, состоящая из 4-х символов (буква, точка, буква, точка), <номер школы> – не более чем двузначный номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы> разделены одним пробелом. Пример входной строки:
Требуется
написать как можно более эффективную программу (укажите используемую
версию языка программирования, например, Borland Pascal 7.0), которая
будет выводить на экран информацию, из какой школы было меньше всего
участников (таких школ может быть несколько). При этом необходимо
вывести информацию только по школам, пославшим хотя бы одного участника.
Следует учитывать, что N>=1000.Решение задачи №10.
var
a:array [1..99] of integer; {целочисленный массив с индексами от 1 до 99, будет содержать число учеников от каждой школы}
c:char; {символьная переменная поможет нам считать фамилии и инициалы учеников}
shol:1..99; {переменная shol будет принимать значение номера школа (от 1 до 99)}
n,i,min:integer; {целочисленные переменные n - количество учеников, i - счетчик, min - минимальное количество учеников от школы}
begin
for i:=1 to 99 do {задаем цикл для обнуления массива}
a[i]:=0; {все элементы массива равны 0}
readln (n); {считываем количество учеников в нашем списке}
for i:=1 to n do {цикл для считывания данных по каждому ученику}
begin
repeat {считываем символы до точки}
read (c);
until c='.';
repeat {считываем символы до точки}
read (c);
until c='.'; {мы считали фамилию и инициалы каждого ученика}
read (shol); {считали номер школы}
a[shol]:=a[shol]+1; {элементы массива с индексом shol будет увеличивать свое значение на 1, таким образом массив будет содержать количество учеников от каждой школы}
end;
min:=n; {переменная min принимает значение количества всех учеников в списке}
for i:=1 to 99 do {задаем цикл для определения минимального количества школьников из из определенной школы}
if (a[i]>0)and(a[i]<min) then min:=a[i]; {проверяем, если элемент массива больше нуля и меньше min значение переменной минимум принимает значение элемента массива, мы нашли минимальный элемент массива}
for i:=1 to 99 do {в данном цикле выводим элементы массива равные минимальному элементу массива}
if a[i]=min then writeln(i); {если элемент массива равен минимальному элементу массива, то выводим на экран индекс элемента массива (номер школы)}
end.
Алгоритм решения задачи
- В данной задаче нам не важны фамилия и инициалы учеников, важно сколько учеников от каждой школы, для подсчета количества учеников вводим целочисленный массив массив
- Считываем фамилию и инициалы, и забываем про них, затем считываем номер школы, и элемент массива с индексом номера школы увеличивает свое значение на 1, считаем сколько учеников от каждой школы
- Затем нам необходимо найти минимальный элемент массива не равный нулю
- В конце выводим все элементы массива равные минимальным элементам массива, мы находим школы из которых меньше всего учеников