原题链接(洛谷):https://www.luogu.com.cn/problem/P1104
原题markdown:
# 生日
## 题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
## 输入格式
输入共有 $n + 1$ 行,
第 $1$ 行为 OI 组总人数 $n$;
第 $2$ 行至第 $n+1$ 行分别是每人的姓名 $s$、出生年 $y$、月 $m$、日 $d$。
## 输出格式
输出共有 $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\leq |s|<20$。保证年月日实际存在,且年份 $\in [1960,2020]$。
题解:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
struct People {
int year;
int month;
int day;
int id;
string name;
} a[N];
bool cmpY(People p1, People p2) {
return p1.year < p2.year;
}
bool id(People p1, People p2) {
return p1.id > p2.id;
}
bool cmpM(People p1, People p2) {
return p1.month < p2.month;
}
bool cmpD(People p1, People p2) {
return p1.day < p2.day;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].name >> a[i].year >> a[i].month >> a[i].day;
a[i].id = i;
}
stable_sort(a, a + n + 1, id);
stable_sort(a, a + n + 1, cmpD);
stable_sort(a, a + n + 1, cmpM);
stable_sort(a, a + n + 1, cmpY);
for (int i = 1; i <= n; i++)
cout << a[i].name << endl;
}
没有回复内容