Задача
Дан список учащихся с указанием годовых оценок по всем предметам. Для поступления в Школу Одаренных Детей необходимо, чтобы средний балл по всем предметам был не ниже, чем $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$ по условию являет натуральным числом, поэтому будет уместно отбросить дробную часть при сравнении, т. е. использовать целочисленных тип данных в вычислениях.
Для отправки комментария необходимо войти на сайт.