csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:生日

csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:生日

题目描述

cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。

输入格式

输入共有 n + 1 n + 1 n+1 行,

第 1 1 1 行为 OI 组总人数 n n n;

第 2 2 2 行至第 n + 1 n+1 n+1 行分别是每人的姓名 s s s、出生年 y y y、月 m m m、日 d d d。

输出格式

输出共有 n n n 行,即 n n n 个年龄从大到小同学的姓名(如果有两个同学年龄相同,输入靠后的同学先输出)。

输入输出样例 #1
输入 #1
复制代码
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
输出 #1
复制代码
Luowen
Yangchu
Qiujingya
说明/提示

数据保证, 1 < n < 100 1<n<100 1<n<100, 1 ≤ ∣ s ∣ < 20 1\leq |s|<20 1≤∣s∣<20。保证年月日实际存在,且年份 ∈ [ 1960 , 2020 ] \in [1960,2020] ∈[1960,2020]。

思路分析

本题要求按年龄从大到小排序,年龄比较规则:出生年份越早、月份越早、日期越早的人年龄越大。若两人年龄完全相同(年、月、日均相同),则输入时靠后的人优先输出(即后来的先输出)。

因此,我们可以为每个人保存四个信息:姓名、出生年、月、日,以及输入时的序号(从 0 开始)。排序时自定义比较函数:先比较年(小的在前),年相同比较月(小的在前),月相同比较日(小的在前);如果年、月、日全部相同,则比较序号(大的在前,因为序号大表示后输入)。这样排序后的序列就是年龄从大到小,且年龄相同时后输入的先输出。

由于数据范围很小(n<100),使用 sort 和自定义比较函数即可轻松完成。


代码实现

cpp 复制代码
#include <bits/stdc++.h> 
using namespace std;

struct P { // 存储个人信息
    string s; // 姓名
    int y, m, d, id; // 年、月、日、输入顺序编号
};

// 自定义排序比较函数,按年龄从大到小,年龄相同时后输入的在前
bool cmp(const P &a, const P &b) {
    if (a.y != b.y) return a.y < b.y; // 出生早的年龄大,年小的在前
    if (a.m != b.m) return a.m < b.m; // 月小的在前
    if (a.d != b.d) return a.d < b.d; // 日小的在前
    return a.id > b.id; // 年龄完全相同,后输入的 id 更大,优先输出
}

int main() {
    int n; // 总人数
    cin >> n;
    vector<P> v(n); // 存储所有人信息
    for (int i = 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 (int i = 0; i < n; ++i) {
        cout << v[i].s << '\n'; // 输出姓名
    }
    return 0;
}

功能分析

  • 输入处理 :读取人数 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 点击跳转


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整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 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
kyle~1 小时前
ROS2---消息过滤
开发语言·c++·机器人·ros2
雪度娃娃1 小时前
C++异步日志系统
开发语言·c++
kyle~1 小时前
ROS2---路径机制辨析
c++·机器人·ros2
charlie1145141913 小时前
基于开源项目的现代C++工程实践——OnceCallback 前置知识(下):C++20/23 高级特性
c++·开源·c++20
蜡笔小马3 小时前
04.C++设计模式-桥接模式
c++·设计模式·桥接模式
宏笋3 小时前
C++ using typedef #define 三者的优缺点比较
c++
枕星而眠3 小时前
一篇吃透 C++ 核心基础:初始化、引用、指针、内联、重载、右值引用
开发语言·数据结构·c++·后端·visual studio
小明同学013 小时前
计算机网络编程---系统调用到并发模型
linux·c++·计算机网络
Season4503 小时前
C/C++的类型转换
c语言·开发语言·c++