Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
149
Добавлен:
17.03.2016
Размер:
1.14 Mб
Скачать

Var Info: array[1..100] of record

name: string;

count: integer;

end;

I, k, p, n, c: integer;

s: string;

begin

readln(N);

for i:=1 to N do begin

readln(s);

p := Pos(' ', s);

s := Copy(s,1,p-1);

c := 1;

for k:=1 to i-1 do

if s = Info[k].name then

c := c + 1;

Info[i].name := s;

Info[i].count := c;

end;

for i:=1 to N do begin

write(Info[i].name);

if Info[i].count > 1 then write(Info[i].count);

writeln;

end;

end.

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

j := i - 1;

while (j > 0) and (fam[i] <> fam[j]) do

dec(j);

Если такая фамилия не найдена и в результате мы получили j=0, принимаем значение счёчика count, равное 1:

var

count: array[0..100] of byte;

fam: array[1..100] of string;

I, j, n: byte;

begin

readln(n);

count[0] := 0;

for i := 1 to n do

begin

readln(fam[i]);

fam[i] := copy(fam[i], 1, pos(' ', fam[i]) - 1);

j := i - 1;

while (j > 0) and (fam[i] <> fam[j]) do dec(j);

count[i] := count[j] + 1;

end;

for i := 1 to n do

begin

write(fam[i]);

if count[i] > 1 then write(count[i]);

writeln;

end;

end.

  1. Это упрощенный вариант второй задачи, подробно разобранной в основной части. Отличия: нужно найти максимум вместо минимума, и только один, а не три.

const LIM = 250;

Var Info: array[1..Lim] of record

name: string;

sum: integer;

end;

I, k, n, mark, max: integer;

c: char;

begin

readln(N);

{ ввод исходных данных }

for i:=1 to N do begin

Info[i].name := '';

for k:=1 to 2 do

repeat

read(c);

Info[i].name := Info[i].name + c;

until c = ' ';

Info[i].sum := 0;

for k:=1 to 3 do begin

read(mark);

Info[i].sum := Info[i].sum + mark;

end;

readln;

end;

{ поиск максимума}

max := Info[1].sum;

for i:=2 to N do

if Info[i].sum > max then

max := Info[i].sum;

{ вывод результата }

for i:=1 to N do

if Info[i].sum = max then

writeln(Info[i].name);

end.

Возможен другой вариант решения (А.С. Абрамов, лицей при РГСУ, г. Воронеж), основанный на следующей идее: в массив записываются фамилии только тех участников, которые имеют суммарный балл, равный максимальному на данный момент; если максимум меняется, возвращаемся к 1-му элементу массива и следующую «цепочку» максимумов записываем поверх предыдущей. Обработка данных выполняется сразу при вводе, отдельный поиск максимума не требуется.

Целая переменная count будет обозначать количество найденных участников с максимальным баллом. В переменной max будем хранить максимальный (на данный момент) результат, а в переменной ball накапливать сумму баллов очередного участника. Тогда алгоритм обработки выглядит так (переменная s содержит фамилию и имя):

if ball > max then begin { новый максимум }

count := 1;

max := ball;

names[1] := s;

end

else

if ball = max then begin { еще один участник в списке }

count := count + 1;

names[count] := s;

end;

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

const LIM = 250;

Соседние файлы в папке ЕГЭ 2016-11 класс