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 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
Luowen
Yangchu
Qiujingya
数据保证,
1
<
n
<
100
1
输出若干个人的生日信息,按照年龄从大到小排序,输出排序后的名字。
如果生日的年月日相同,则按先输入的后输出。
提示:这里使用结构体排序会更方便些。
采用的是快速排序(即sort排序):
头文件:
#include
这里说几点传参问题:
例如:sort(pos,pos+n,cmp);
#include
#include
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;
}