На вход программы подаются сведения о набранных на ЕГЭ баллах учениками данной школы по трём предметам. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: < Фамилия > < Инициалы > <БаллыПоРусскомуЯзыку> <БаллыПоМатематике> <БаллыПоИнформатике>, где <Фамилия> — строка, состоящая не более чем из 20 символов, < Инициалы > — строка, состоящая из 4-х символов (буква, точка, буква, точка), <БаллыПоРусскомуЯзыку>, <БаллыПоМатематике>, <БаллыПоИнформатике> — целые числа в диапазоне от 0 до 100. Все элементы одной строки отделены друг от друга пробелом.
Пример входной строки: Петров С. Н. 78 82 70
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и инициалы учеников, набравших минимальное среднее арифметическое баллов по трём предметам, отличное от 0 (таких учеников может быть несколько), а также среднее арифметическое набранных ими баллов.
Следует учитывать, что N ^ 100.
var fio:array[1..100] of string;
var fioMin:array[1..100] of string;
var sumMin:array[1..100] of integer;
bRus:array[1..100] of integer;
bMath:array[1..100] of integer;
bInf:array[1..100] of integer;
min,N,i,k,b,sum,iMin: integer;
с: char;
iMin: = 1;
begin readln(N);
min:=300;
for i:=1 to N do
begin
fio[i]:='';
for k:=1 to 2 do
repeat read(c);
fio[i]:=fio[i]+c;
until c=' ';
read(bRus[i]);
read(bMath[i]);
read(bInf[i]);
sum = (bRus[i] + bMath[i] + bInf[i]);
if sum = min then
begin
fioMin[iMin] = fio[iMin];
sumMin[iMin] = sum;
iMin = iMin + 1;
end;
if sum < min then
begin
min: = sum;
for i:=1 to 100 do
begin
fioMin[i]: = '';
end;
fioMin[1]: = fio[i];
sumMin[1] = sum;
iMin := 1;
end;
end;
for (i:=iMin downto 1) writeln(fioMin[i], sumMin[i]);
end.
Приведём решение Ильи Муратова, Python.
n = int(input())
pupils = []
min_sum = 301
for i in range(n):
lname, name_io, r_mark, m_mark, i_mark = input().split(' ')
mark_sum = int(r_mark) + int(m_mark) + int(i_mark)
if mark_sum < min_sum and mark_sum != 0:
pupils = []
pupils.append(lname + ' ' + name_io)
min_sum = mark_sum
elif mark_sum == min_sum and mark_sum != 0:
pupils.append(lname + ' ' + name_io)
for pupil in pupils:
print pupil, min_sum / 3. # точка важна, иначе будет целочисленное деление


Предлагаю свое решение на C++
int main()
{
int MinAvg = 301, N, m1,m2,m3;
string lname, fname;
vector<pair<int, string>> vec;
vec.push_back(make_pair(301, "vasyan"));
cin >> N;
for (; N != 0;--N)
{
cin >> lname >> fname >> m1 >> m2 >> m3;
MinAvg = (m1 + m2 + m3) / 3;
if (vec[0].first == MinAvg)
vec.push_back(make_pair(MinAvg, lname + ' ' + fname));
if(vec[0].first>MinAvg)
{
vec.clear();
vec.push_back(make_pair(MinAvg, lname + ' ' + fname));
}
}
cout << endl;
for(auto x:vec)
{
cout << x.second << ' ' << x.first << endl;
}
}
{ предлагаю свой более понятный, оптимальный по памяти и времени код на языке паскаль }
program z27; uses crt;
type uch=record bal:real; nam:string; end;
var i,n,m1,m2,m3:integer; ch:char; s:string; min:real;
a:array[1..100] of uch;
begin
clrscr;
readln(n); s:='';
for i:=1 to n do
begin
repeat
read(ch); s:=s+ch;
until ch=' ';
s:=s+' ';
repeat
read(ch); s:=s+ch;
until ch=' ';
read(m1,m2,m3);
a[i].nam:=s; s:='';
a[i].bal:=(m1+m2+m3)/3;
end;
min:=101;
for i:=1 to n do if (a[i].bal < min) and (a[i].bal > 0) then min:=a[i].bal;
for i:=1 to n do if (a[i].bal=min) then writeln(a[i].nam,' ',a[i].bal); readkey;
end.