Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфорамтика C4 ответы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
912.38 Кб
Скачать

Var schMax, schCount: array[1..Max] of integer;

В начале оба массива обнуляются:

for i:=1 to MAX do begin

schMax[i] := 0;

schCount[i] := 0;

end;

В этой задаче фамилии и имена нам не нужны, при чтении их можно пропускать. Дойдя до второго пробела, читаем номер школы и балл в целые переменные sch и ball:

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(sch, ball);

Если балл текущего ученика равен максимальному, увеличиваем счетчик максимальных баллов для этой школы:

if ball = schMax[sch] then

schCount[sch] := schCount[sch] + 1;

Если балл текущего ученика больше предыдущего максимального, записываем новый максимум и сбрасываем счетчик максимальных баллов для этой школы в единицу:

if ball > schMax[sch] then begin

schMax[sch] := ball;

schCount[sch] := 1;

end;

После чтения всех N строк (в цикле) нужно искать максимум в массиве schMax. Попутно (чтобы не делать второй цикл) ищем наибольшее значение счетчика среди всех школ, у которых наибольший балл. Сначала считаем, что лучшая школа – первая:

ball := schMax[1];

count := schCount[1];

Затем в цикле просматриваем все остальные школы. Если балл равен максимальному, ищем наибольшее значение счетчика:

if (schMax[i] = ball) and (schCount[i] > count) then

count := schCount[i];

Если балл больше предыдущего максимального, запоминаем новое максимальное значение и новое значение счетчика:

if schMax[i] > ball then begin

ball := schMax[i];

count := schCount[i];

end;

В конце программы выводим номера школ, в которых и балл, и счетчик равны найденным максимальным значениям:

for i:=1 to MAX do

if (schMax[i] = ball) and (schCount[i] = count) then

writeln(i)

Вот полная программа:

const MAX = 99;

Var schMax, schCount: array[1..Max] of integer;

I, n, sch, ball, count: integer;

c: char;

begin

for i:=1 to MAX do begin

schMax[i] := 0;

schCount[i] := 0;

end;

readln(N);

for i:= 1 to N do begin

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(sch, ball);

if ball = schMax[sch] then

schCount[sch] := schCount[sch] + 1;

if ball > schMax[sch] then begin

schMax[sch] := ball;

schCount[sch] := 1;

end;

end;

ball := schMax[1];

count := schCount[1];

for i:=2 to MAX do begin

if (schMax[i] = ball) and (schCount[i] > count) then

count := schCount[i];

if schMax[i] > ball then begin

ball := schMax[i];

count := schCount[i];

end;

end;

for i:=1 to MAX do

if (schMax[i] = ball) and (schCount[i] = count) then

writeln(i)

end.

Более простое решение предложил (Д.Ф. Муфаззалов, г. Уфа). Можно запоминать только максимальный балл среди всех учащихся района в отдельной переменной, а в массиве – количество учащихся, набравших такой балл в каждой школе:

const MAX = 99;

Var schCount:array[1..Max] of integer;

maxBall, maxCount, i, N: integer;

sch, ball, j:integer;

c: char;

begin

maxBall:=0;

readln(N);

for i:=1 to n do begin

for j:=1 to 2 do

repeat read(c); until c=' ';

readln(sch, ball);

if ball > maxBall then begin

maxBall:= ball;

for j:=1 to MAX do schCount[j]:=0;

{если найден новый максимум, то количество учеников с таким

баллом во всех школах обнуляется}

end;

if ball = maxBall then