题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有 n + 1 n + 1 n+1 行,
第 1 1 1 行为 OI 组总人数 n n n;
第 2 2 2 行至第 n + 1 n+1 n+1 行分别是每人的姓名 s s s、出生年 y y y、月 m m m、日 d d d。
输出格式
输出共有 n n n 行,
即 n n n 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
样例 #1
样例输入 #1
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
样例输出 #1
Luowen
Yangchu
Qiujingya
提示
数据保证, 1 < n < 100 1<n<100 1<n<100, 1 ≤ ∣ s ∣ < 20 1\leq |s|<20 1≤∣s∣<20。保证年月日实际存在,且年份 ∈ [ 1960 , 2020 ] \in [1960,2020] ∈[1960,2020]。
1.题目分析
输出若干个人的生日信息,按照年龄从大到小排序,输出排序后的名字。
如果生日的年月日相同,则按先输入的后输出。
提示:这里使用结构体排序会更方便些。
采用的是快速排序(即sort排序):
头文件:
cpp
#include <algorithm>
这里说几点传参问题:
例如:sort(pos,pos+n,cmp);
- 第一个参数pos代表数组的起始地址的指针
- 第二个参数pos+n代表数组的结束地址的指针
- 第三个参数cmp重写排序规则的函数
2.题目思路
- 定义结构体存储个人信息:姓名,生日日期以及输入的初始顺序
- 定义sort排序的规则函数:生日从小到大,如果生日一致,先输入的后输出。
- 进入主函数
- 定义结构体数组,键入每个人的信息并记录输入的顺序
- 调用sort排序,传入结构体数组的起始,结束指针,规则函数
- 最后遍历打印结构体数组中的名字信息
3.代码实现
cpp
#include <iostream>
#include <algorithm>
using namespace std;
//每个人的信息
typedef struct data {
char name[20];
int y, m, d;
//初始顺序
int sequence;
} classmate;
//定义sort的排序函数
bool cmp(classmate c1, classmate c2) {
//判断年月日按从小到大排
if (c1.y == c2.y) {
if (c1.m == c2.m) {
if (c1.d == c2.d) {
//输入靠后的先输出
return c1.sequence > c2.sequence;
} else {
return c1.d < c2.d;
}
} else {
return c1.m < c2.m;
}
}
return c1.y < c2.y;
}
int main() {
int n;
cin >> n;
classmate classmates[n];
//键入数据
for (int i = 0; i < n; ++i) {
cin >> classmates[i].name >> classmates[i].y >> classmates[i].m >> classmates[i].d;
classmates[i].sequence = i + 1;
}
//排序
sort(classmates, classmates + n, cmp);
//输出结果
for (int i = 0; i < n; ++i) {
cout << classmates[i].name << endl;
}
return 0;
}