洛谷题单指南-排序-P1104 生日
原题链接:https://www.luogu.com.cn/problem/P1104
题意解读:将学生按照年龄由大到小排序,如果年龄相同,后输入的排在前面,输出排序后的学生姓名。
解题思路:
此题是一个排序常规题,年龄大排在前说明年、月、日越小越在前面,核心的排序思路如下:
1、如果年份不同,按年份由小到大排序
2、如果年份相同,月份不同,按月份由小到大排序
3、如果年份、月份相同,日不同,按日由小到大排序
4、年、月、日都相同,输入靠后的排在前面
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
struct Student
{
int idx;
string name;
int y, m, d;
} s[N];
bool cmp(Student s1, Student s2)
{
if(s1.y != s2.y) return s1.y < s2.y; //如果年份不同,按年份由小到大排序
if(s1.m != s2.m) return s1.m < s2.m; //如果年份相同,月份不同,按月份由小到大排序
if(s1.d != s2.d) return s1.d < s2.d; //如果年份、月份相同,日不同,按日由小到大排序
return s1.idx > s2.idx; //年、月、日都相同,输入靠后的排在前面
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
s[i].idx = i; //记录每个学生的编号,以便按输入顺序排序
cin >> s[i].name >> s[i].y >> s[i].m >> s[i].d;
}
sort(s + 1, s + n + 1, cmp);
for(int i = 1; i <= n; i++) cout << s[i]. name << endl;
}