由于只需要输出学生姓名,不用输出具体日期,所以可以在输入时将生日年月日转化为天数(不考虑闰年和大小月),方便写排序函数。
先厘清输出顺序的关系:
当有两个同学生日相同,输入靠后的同学先输出。
生日大的同学天数小。
所以排序函数 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题解