Задача
Однажды, неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям.
Входные данные
В первой строке дано число $N \left(1 \leqslant N \leqslant 1000\right)$ – количество личных дел. Далее для каждого из $N$ учащихся следующие данные (каждое в своей строке): фамилия и имя, класс, дата рождения. Фамилия и имя – строки не более чем из $20$ символов, класс – строка состоящая из числа (от $1$ до $11$) и латинской буквы (от «A» до «Z»), дата рождения – дата в формате «ДД.ММ.ГГ». Гарантируется, что внутри одного класса нет однофамильцев.
Выходные данные
В выходной файл требуется вывести $N$ строк, в каждой из которых записаны данные по одному учащемуся. Строки должны быть упорядочены сначала по классам, а затем по фамилиям.
Тесты
# | ВХОДНЫЕ ДАННЫЕ | ВЫХОДНЫЕ ДАННЫЕ |
---|---|---|
1 | 3 Sidorov Sidor 9A 20.07.93 Petrov Petr 10B 23.10.92 Ivanov Ivan 9A 10.04.93 |
9A Ivanov Ivan 10.04.93 9A Sidorov Sidor 20.07.93 10B Petrov Petr 23.10.92 |
2 | 4 Petrov Sidor 9A 20.07.02 Sidorov Petr 10B 23.10.01 Ivanov Bogdan 9A 10.04.02 Tereshkova Olga 9B 17.08.02 |
9A Ivanov Bogdan 10.04.02 9A Petrov Sidor 20.07.02 9B Tereshkova Olga 17.08.02 10B Sidorov Petr 23.10.01 |
3 | 2 Borisevich Sidor 9A 20.03.02 Burkalo Petr 9A 23.12.01 |
9A Borisevich Sidor 20.03.02 9A Burkalo Petr 23.12.01 |
4 | 1 Zadorozhniy Pavel 11A 20.03.02 |
11A Zadorozhniy Pavel 20.03.02 |
Код 1
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 |
#include <iostream> #include <string> using namespace std; struct student { string name, surname; char letter; int Class; string date; }; bool operator > (const student &a, const student &b) { bool res = false; if (a.Class > b.Class) res = true; else if (a.Class == b.Class) { if (a.letter > b.letter) res = true; else if (a.letter == b.letter) { if (a.surname > b.surname) res = true; } } return res; }; int main() { int n; cin >> n; student *a = new student[n]; for (int i = 0; i < n; i++) { cin >> a[i].surname >> a[i].name >> a[i].Class >> a[i].letter >> a[i].date; } for (int k = 2; k <= n; k++) { for (int i = 0; i <= n - k; i++) { if (a[i] > a[i + 1]) { swap(a[i], a[i + 1]); } } } for (int i = 0; i < n; i++) { cout << a[i].Class << a[i].letter << " " << a[i].surname << " " << a[i].name << " " << a[i].date << endl; } return 0; } |
Код 2
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 |
#include <iostream> using namespace std; struct student { char name[21]; char surname[21]; char letter; int Class; char date[9]; }; bool operator > (const student & a, const student & b) { bool res = false; bool tmp = true; if (a.Class > b.Class) res = true; else if (a.Class == b.Class) { if (a.letter > b.letter) res = true; else if (a.letter == b.letter) { for (int i = 0; i < 21; i++) { if (a.surname[i] < b.surname[i]) { tmp = false; break; } else if (a.surname[i] > b.surname[i]) { tmp = true; break; } } if (tmp) res = true; } } return res; }; int main() { int n; cin >> n; student *a = new student[n]; for (int i = 0; i < n; i++) { cin >> a[i].surname >> a[i].name >> a[i].Class >> a[i].letter >> a[i].date; } for (int k = 2; k <= n; k++) { for (int i = 0; i <= n - k; i++) { if (a[i] > a[i + 1]) { swap(a[i], a[i + 1]); } } } for (int i = 0; i < n; i++) { cout << a[i].Class << a[i].letter << " " << a[i].surname << " " << a[i].name << " " << a[i].date << endl; } return 0; } |
Решение
Для решения этой задачи напишем структуру student, в которой каждый элемент будет охарактеризован именем, фамилией, номером и буквой класса, а также датой рождения. Затем определим оператор >, которым будем сравнивать личные дела учащихся по номеру и букве класса, а также по фамилии. Сравнение по имени нам не нужно, так как в условии сказано, что в одном классе однофамильцев не будет. Введём всю информацию, что нам дана и в цикле сравним все личные дела учащихся с помощью этого оператора, при этом меняя личные дела местами при помощи функции swap, если это необходимо. Затем также в цикле выведем в правильном порядке личные дела в заданном виде.
Запустить код 1 (ideone) можно здесь
Запустить код 2 (ideone) можно здесь
Задача на E-olymp