P1104 生日

解题思路

这道题目要求对学生的生日信息进行排序,按照年龄从大到小(即出生日期从早到晚)的顺序输出姓名。如果生日相同,则输入靠后的同学先输出。

方法思路

  1. 结构体存储:使用结构体存储每个学生的姓名、出生年月日和输入顺序ID

  2. 自定义排序

    • 首先按年份从小到大排序

    • 年份相同则按月从小到大排序

    • 年月相同则按日从小到大排序

    • 日期完全相同则按输入顺序ID从大到小排序(后输入的排在前面)

  3. 输出结果:按照排序后的顺序输出学生姓名

代码注释

#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;
}

 

posted @ 2025-05-20 17:54  CRt0729  阅读(36)  评论(0)    收藏  举报