HBC230938过生日【洛谷 P1104】生日题解(结构体排序+稳定排序),解题思路与题解代码

初见你 算法基础篇 112 0
全网最全C++题库,助您快速提升编程技能!题库丰富多样,涵盖各个领域,让您在练习中不断成长!


由于只需要输出学生姓名,不用输出具体日期,所以可以在输入时将生日年月日转化为天数(不考虑闰年和大小月),方便写排序函数。

先厘清输出顺序的关系:

    当有两个同学生日相同,输入靠后的同学先输出。
    生日大的同学天数小。

所以排序函数 cmp 让结构体按天数 d 从大到小排序。使用稳定排序 stable_sort 保证当有两个同学生日相同,输入靠后的同学先输出。最后将结构体数组倒序输出。

AC代码

#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
int i,j; 
struct birthday{
    int y,m,d,id;   //year month day 
    string name;
}bir[50010];    

bool mycmp(birthday a,birthday b){
    return(a.y<b.y || a.y==b.y && a.m < b.m ||a.y==b.y && a.m == b.m && a.d < b.d ||
    a.y==b.y && a.m == b.m && a.d == b.d && a.id>b.id  );  //年龄从大到小 ,生日相同,输入靠后的先输出 
}
int main(){
    int n;    
    cin>>n;
    for(i=1; i<=n; i++){  //输入 
        cin>>bir[i].name>>bir[i].y>>bir[i].m>>bir[i].d;
        bir[i].id=i;
    }
    
    sort(bir+1,bir+n+1,mycmp);//排序 
    
    for(i=1; i<=n; i++){  //输出 
        cout<<bir[i].name<<endl;
    } 
    
    return 0;
}
HBC230938过生日,思维2题解
(图片来源网络,侵删)
不断挑战自我,才能突破极限!全网最全C++题库,让您在编程道路上越走越远。

标签: HBC230938过生日 思维2题解