洛谷题单指南-排序-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;
}

 

posted @ 2024-01-30 14:48  五月江城  阅读(63)  评论(0编辑  收藏  举报