P1104 生日
解题思路
这道题目要求对学生的生日信息进行排序,按照年龄从大到小(即出生日期从早到晚)的顺序输出姓名。如果生日相同,则输入靠后的同学先输出。
方法思路
-
结构体存储:使用结构体存储每个学生的姓名、出生年月日和输入顺序ID
-
自定义排序:
-
首先按年份从小到大排序
-
年份相同则按月从小到大排序
-
年月相同则按日从小到大排序
-
日期完全相同则按输入顺序ID从大到小排序(后输入的排在前面)
-
-
输出结果:按照排序后的顺序输出学生姓名
代码注释
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; // 定义结构体存储学生信息 struct node{ string name; // 姓名 int y,m,d; // 年、月、日 int id; // 输入顺序ID }; node a[N]; // 存储所有学生信息 int n; // 学生人数 // 自定义比较函数 bool cmp(node a, node b) { if(a.y == b.y){ // 年份相同 if(a.m == b.m){ // 月份相同 if(a.d == b.d) return a.id > b.id; // 日期相同,按ID降序 else return a.d < b.d; // 日期不同,按日升序 } else return a.m < b.m; // 月份不同,按月升序 } else return a.y < b.y; // 年份不同,按年升序 } int main() { cin >> n; // 读取学生人数 for(int i = 1; i <= n; i++) // 读取每个学生信息 { cin >> a[i].name >> a[i].y >> a[i].m >> a[i].d; a[i].id = i; // 记录输入顺序 } sort(a + 1, a + 1 + n, cmp); // 排序 for(int i = 1; i <= n; i++) // 输出结果 cout << a[i].name << endl; return 0; }

浙公网安备 33010602011771号