1 条题解

  • 0
    @ 2025-8-24 21:21:00

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Yxa_Sheep
    打表过样例,暴力出奇迹,搜索真牛逼,骗分进省一||深搜 MLE,广搜 TLE,打表 RE,退火又 CE||删掉 display 看主页||被封取关(解封后私信)||六年级蒟蒻 ,代词请用“他”||当前状态:<离线>

    搬运于2025-08-24 21:20:59,当前版本为作者最后更新于2025-08-10 22:50:05,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    题意

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

    思路

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

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

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

    题目传送门

    • 1

    信息

    ID
    106
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者