整体代码结构
代码分为 头文件引入、全局变量/结构体定义、排序规则函数、主函数(输入→排序→输出) 四部分,核心是通过自定义排序规则实现“男生左(升序)、女生右(降序)”的要求。
逐部分详细解释
1. 头文件引入
* #include <bits/stdc++.h>:C++的万能头文件,包含了所有常用标准库(如输入输出、排序、字符串等),无需单独引入iostream、algorithm等,简化代码。
* using namespace std;:使用标准命名空间,避免每次写std::cin、std::sort等,简化代码书写。
2. 全局变量与结构体定义
* 全局变量n:主函数内外都能访问,无需额外传参。
* 结构体str:把“性别”和“身高”两个关联数据封装在一起,方便批量存储和排序。
* 数组a[50]:用数组存储所有人的信息,下标从1开始(符合日常计数习惯)。
3. 自定义排序规则函数 CMP
这是代码的核心逻辑,需要重点理解:
* sort函数默认按“升序”排序,但这里通过cmp函数自定义排序规则。
* cmp(x,y)的返回值决定x和y的相对位置:
* 返回true:x排在y左边;
* 返回false:y排在x左边。
* 规则拆解:
1. 先区分性别:男生和女生比较时,男生必在左,女生必在右;
2. 再同性别排序:男生内部按身高从矮到高,女生内部按身高从高到矮。
4. 主函数(程序执行入口)
主函数的执行流程是“输入→排序→输出”,逐行解释:
* 输入部分:
* cin >> n:读取第一行的总人数;
* 循环i=1到n:依次读取每个人的性别和身高,存入a[i].s(性别)和a[i].t(身高)。
* 排序部分:
* sort(a+1, a+n+1, cmp):C++标准库的排序函数,作用范围是数组a的第1个到第n个元素,排序规则是cmp函数。
* 执行后,数组a中的元素会按照“男生左(升序)、女生右(降序)”重新排列。
* 输出部分:
* printf("%.2lf ", a[i].t):格式化输出身高,%.2lf表示“保留2位小数的浮点数”,末尾加空格分隔。
* 循环输出排序后的所有身高,即最终的排队结果。
结合样例理解执行过程
输入样例:
排序前数组a的身高:[1.72, 1.78, 1.61, 1.65, 1.70, 1.56]
执行sort后,按cmp规则排序:
1. 男生(a1、a2、a4)排左边,按身高升序:1.65(a4)→1.72(a1)→1.78(a2);
2. 女生(a3、a5、a6)排右边,按身高降序:1.70(a5)→1.61(a3)→1.56(a6);
最终输出:1.65 1.72 1.78 1.70 1.61 1.56(和样例输出一致)。
小优化(可选)
原代码的输出会在末尾多一个空格(比如样例输出最后有个多余空格),虽然大部分OJ平台会忽略,但严格符合题目要求的话可以修改:
总结
这份代码的核心思路是:
1. 用结构体封装“性别+身高”,方便批量处理;
2. 自定义排序规则,优先区分男女位置,再按身高排序;
3. 输入→排序→输出,流程清晰,贴合题目要求。
代码的每一部分都围绕“实现排队规则”展开,结构体和自定义排序是关键,也是C++处理这类“多条件排序”问题的典型写法。