题解:P1104 生日

· · 题解

题目传送门

题意

给定 n 个人的姓名与出生日期,按年龄从大到小排序后输出。如果有两个同学生日相同,输入靠后的同学先输出。

思路

我们用结构体储存每个同学的信息时还可以用 id 记下他是第几个输入的,这样在生日相同时可以比较谁的 id 大。
接下来就是正常比较年龄了,我们都知道谁的出生年 y 小谁就年龄大。如果 y 相同就比较谁的 m 小,如果 m 相同就比较谁的 d 小,如果 d 也相同就比较谁的 id 大。于是得到了以下比较函数:

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;
            return a.d < b.d;
        }
        return a.m < b.m;
    }
    return a.y < b.y;
}

其他细节见代码。

代码

#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
    string s;
    int id, y, m, d;
} a[110];
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;
            return a.d < b.d;
        }
        return a.m < b.m;
    }
    return a.y < b.y;
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0); 
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].s >> a[i].y >> a[i].m >> a[i].d;
        a[i].id = i;
    }
    sort(a + 1, a + n + 1, cmp);
    for (int i = 1; i <= n; i++)
        cout << a[i].s << "\n";
    return 0;
}

题解来之不易,且看且珍惜。给个赞再走吧。

题目传送门