Задача
Дан список учащихся с указанием годовых оценок по всем предметам. Для поступления в Школу Одаренных Детей необходимо, чтобы средний балл по всем предметам был не ниже, чем $K$. Определите, кого из перечисленных ребят могут зачислить в эту школу.
Формат входных данных
В первой строке дано число $N$ ($1 \leqslant N \leqslant 10000$), количество учащихся в списке. Каждая из следующих $N$ строк имеет вид: фамилия и имя, затем число $M_i$ ($1 \leqslant M_i \leqslant 50$) — количество предметов, которые изучал ученик, а затем годовые оценки по каждому из этих предметов.
В последней строке дано единственное число $K$ — проходной балл. Фамилия и имя — строки, состоящие не более чем из $20$ латинских букв. Все числа во входном файле натуральные и не превышают $10^9$.
Формат выходных данных
Требуется вывести список ребят, которые могут быть зачислены.
Тесты
| № | Входные данные | Выходные данные | 
| 1 | 3 Ivanov Ivan 2 7 9 Petrov Petr 1 7 Sidorov Sidor 2 10 8 4 | Ivanov Ivan Petrov Petr Sidorov Sidor | 2 | 1 Ivanov Ivan 1 6 5 | Ivanov Ivan | 3 | 4 Petrov Petr 10 1 2 3 4 5 6 7 8 9 10 Sidorov Sidor 5 8 8 8 4 4 Ivanov Ivan 0 Darienko Dasha 3 10 3 9 6 | Sidorov Sidor Darienko Dasha | 4 | 2 Petrov Petr 10 1 2 3 4 5 6 7 8 9 10 Darienko Dasha 3 10 3 9 11 | 5 | 5 Petrov Petr 10 100000000 200000000 300000000 400000000 500000000 600000000 700000000 800000000 900000000 1000000000 Darienko Dasha 5 500000000 500000000 500000000 700000000 800000000 Sidorov Sidor 20 100000000 200000000 300000000 400000000 500000000 600000000 700000000 800000000 900000000 1000000000 500000000 500000000 500000000 700000000 800000000 500000000 500000000 500000000 700000000 800000000 Ivanov Ivan 8 600000000 600000000 600000000 800000000 200000000 1000000000 300000000 300000000 Sergeev Alexandr 1 700000000 600000000 | Darienko Dasha Sergeev Alexandr | 
Код
Оптимальное решение:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> #include <string> #define surname 0 #define name 1 #define column 2 using namespace std; int main() {     //количество учеников     int n;     cin >> n;     //в первый столбец запишем фамилии, во второй - имена     string names[column][n];     //тут будут средние баллы соответствующих учеников      int average [n];     //количество предметов и текущий балл данного ученика     int subjects, mark;     //сумма оценок данного ученика     long sum;     for (auto i = 0; i < n; i++){         sum = 0;         //последовательный ввод фамилии, имени и количества предметов         cin >> names[surname][i] >> names[name][i] >> subjects;         //ввод оценок в нужном количестве и подсчет суммы         for (auto j = 0; j < subjects; j++){             cin >> mark;             sum += mark;         }         //вычисление среднего для данного ученика         average[i] = sum / subjects;     }     //средний проходной балл     int k;     cin >> k;     //если среднее не меньше проходного балла,      //выводим фамилию и имя данного ученика     for (auto i = 0; i < n; i++){         if (average[i] >= k) cout << names [surname][i] <<          " " << names[name][i] << endl;     }     return 0; } | 
Более структурированное решение:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <iostream> #include <string> using namespace std; struct student {     string name, surname;     int average;     void inputFullName() {         cin >>surname >>name;     }     void printFullName() {         cout <<surname <<" " <<name <<endl;     }     void inputMarks() {         int subjects, mark;         long sum = 0;         cin>> subjects;         //ввод оценок в нужном количестве и подсчет суммы         for (auto j = 0; j < subjects; j++){             cin >>mark;             sum +=mark;         }         //вычисление среднего для данного ученика         average = sum / subjects;     }     bool passCheck(int k) {         return average >= k;     } }; int main() {     //количество учеников и средний проходной балл     int n;     cin >> n;     //массив учеников     student list[n];     for (auto i = 0; i < n; i++){         list[i].inputFullName();         list[i].inputMarks();     }     //ввод среднего проходного балла     int k;     cin >> k;     //если среднее не меньше проходного балла,      //выводим фамилию и имя данного ученика     for (auto i = 0; i < n; i++){         if (list[i].passCheck(k))              list[i].printFullName();     }     return 0; } | 
Решение
Введем данные в соответствующие структуры (см. комментарии в коде), вычислим средние баллы для каждого ученика и выведем фамилии и имена всех тех и только тех, чей средний балл выше проходного.
Т. к. все исходные данные натуральные и не превышают $10^9$ используем для их ввода тип  
			int. При этом сумма оценок может выйти за пределы типа 
			int ($50\cdot10^9 > 2 147 483 647$), поэтому для переменной 
			sum используем тип 
			long. Также заметим, что среднее арифметическое натуральных чисел может быть дробным числом, но в данном случаи средний проходной балл $K$ по условию являет натуральным числом, поэтому будет уместно отбросить дробную часть при сравнении, т. е. использовать целочисленных тип данных в вычислениях.
