csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:生日
题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有n + 1 n + 1n+1行,
第1 11行为 OI 组总人数n nn;
第2 22行至第n + 1 n+1n+1行分别是每人的姓名s ss、出生年y yy、月m mm、日d dd。
输出格式
输出共有n nn行,即n nn个年龄从大到小同学的姓名(如果有两个同学年龄相同,输入靠后的同学先输出)。
输入输出样例 #1
输入 #1
3 Yangchu 1992 4 23 Qiujingya 1993 10 13 Luowen 1991 8 1输出 #1
Luowen Yangchu Qiujingya说明/提示
数据保证,1 < n < 100 1<n<1001<n<100,1 ≤ ∣ s ∣ < 20 1\leq |s|<201≤∣s∣<20。保证年月日实际存在,且年份∈ [ 1960 , 2020 ] \in [1960,2020]∈[1960,2020]。
思路分析
本题要求按年龄从大到小排序,年龄比较规则:出生年份越早、月份越早、日期越早的人年龄越大。若两人年龄完全相同(年、月、日均相同),则输入时靠后的人优先输出(即后来的先输出)。
因此,我们可以为每个人保存四个信息:姓名、出生年、月、日,以及输入时的序号(从 0 开始)。排序时自定义比较函数:先比较年(小的在前),年相同比较月(小的在前),月相同比较日(小的在前);如果年、月、日全部相同,则比较序号(大的在前,因为序号大表示后输入)。这样排序后的序列就是年龄从大到小,且年龄相同时后输入的先输出。
由于数据范围很小(n<100),使用sort和自定义比较函数即可轻松完成。
代码实现
#include<bits/stdc++.h>usingnamespacestd;structP{// 存储个人信息string s;// 姓名inty,m,d,id;// 年、月、日、输入顺序编号};// 自定义排序比较函数,按年龄从大到小,年龄相同时后输入的在前boolcmp(constP&a,constP&b){if(a.y!=b.y)returna.y<b.y;// 出生早的年龄大,年小的在前if(a.m!=b.m)returna.m<b.m;// 月小的在前if(a.d!=b.d)returna.d<b.d;// 日小的在前returna.id>b.id;// 年龄完全相同,后输入的 id 更大,优先输出}intmain(){intn;// 总人数cin>>n;vector<P>v(n);// 存储所有人信息for(inti=0;i<n;++i){cin>>v[i].s>>v[i].y>>v[i].m>>v[i].d;v[i].id=i;// 记录输入顺序编号}sort(v.begin(),v.end(),cmp);// 排序for(inti=0;i<n;++i){cout<<v[i].s<<'\n';// 输出姓名}return0;}功能分析
- 输入处理:读取人数
n,随后循环读取每个人的姓名、出生年、月、日,同时记录输入顺序编号id。 - 排序规则:使用
std::sort配合自定义比较函数cmp。比较优先级依次为:年份 → 月份 → 日期 → 输入顺序(降序)。年份、月份、日期升序保证出生早的人排在前面(年龄大);年份、月份、日期全相等时,后输入的人(id大)排在前面,符合题意。 - 输出:按排序后的顺序输出每个人的姓名,每行一个。
- 时间复杂度:排序 O(n log n),完全满足 n<100 的要求。
- 空间复杂度:O(n),仅存储每个人信息。
【完整系列请查看专栏】:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}