Вот, что-то нарисовал. Не могу гарантировать, что программа так уж абсолютно оптимизирована, но чем богаты.
Код:
Type Participant=Record
Surname:String;
Name:String;
Class:Byte;
Balls:Word;
End;
var
N:BYTE;
Prt:Array[1..25] of Participant;
Num_first,Num_Second:Array[1..25] of Byte;
Ball:Array[1..25] of WORD;
Ball_first,Ball_second:WORD;
N_first, N_second:BYTE;
i,j:Integer;
begin
{Ввод исходных данных по участникам}
Write('Enter the number of participants (<26) ');
ReadLn(N);
For i:=1 to N do
With Prt[i] do
begin
WriteLn('Surname (max 20 symbols)');
ReadLn(Surname);
WriteLn('Name (max 15 symbols)');
ReadLn(Name);
Write('Class ');
ReadLn(Class);
Write('Balls ');
ReadLn(Balls);
WriteLn;
end;
{Поиск высшего балла}
Ball_First:=0;
For i:=1 to N do
With Prt[i] do
If Balls>Ball_First then Ball_First:=Balls;
{Поиск количества участников, имеющих высший балл, и их порядковых номеров в списке}
N_first:=0;
For i:=1 to N do
With Prt[i] do
If Balls=Ball_First then
begin
Inc(N_first);
Num_first[N_first]:=i;
end;
{Поиск второго по величине балла}
Ball_Second:=0;
For i:=1 to N do
With Prt[i] do
If (Balls>Ball_Second) and (Balls<Ball_First) then Ball_Second:=Balls;
{Поиск количества участников, имеющих второй балл, и их порядковых номеров в списке}
N_Second:=0;
For i:=1 to N do
With Prt[i] do
If Balls=Ball_Second then
begin
Inc(N_Second);
Num_Second[N_Second]:=i;
end;
{Вывод информации}
WriteLn('Winners:');
If (Ball_First<200) or (1.0*N_first/N>0.2) then
begin
WriteLn('None');
WriteLn;
WriteLn('Best:');
If N_first=1 then
WriteLn(Prt[Num_First[1]].Surname+' '+Prt[Num_First[1]].Name) else
WriteLn(N_First);
end else
If (Ball_First>=200) and (1.0*N_first/N<=0.2) then
begin
For i:=1 to N_first do
WriteLn(Prt[Num_First[i]].Surname+' '+Prt[Num_First[i]].Name);
WriteLn;
WriteLn('Second:');
If N_Second>1 then WriteLn(N_Second);
WriteLn(Prt[Num_Second[1]].Surname+' '+Prt[Num_Second[1]].Name);
end;
ReadLn;
end.