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