正经题解 | 合影效果
2025-12-31 19:37:30
发布于:广东
0阅读
0回复
0点赞
整体代码结构
代码分为 头文件引入、全局变量/结构体定义、排序规则函数、主函数(输入→排序→输出) 四部分,核心是通过自定义排序规则实现“男生左(升序)、女生右(降序)”的要求。
逐部分详细解释
1. 头文件引入
#include <bits/stdc++.h>
using namespace std;
#include <bits/stdc++.h>:C++的万能头文件,包含了所有常用标准库(如输入输出、排序、字符串等),无需单独引入iostream、algorithm等,简化代码。using namespace std;:使用标准命名空间,避免每次写std::cin、std::sort等,简化代码书写。
2. 全局变量与结构体定义
int n; // 存储总人数
struct str { // 定义结构体,存储每个人的“性别+身高”
string s; // 性别:"male" 或 "female"
double t; // 身高:浮点数(单位米)
}a[50]; // 结构体数组a,最多存50人(题目n≤40,留冗余)
- 全局变量
n:主函数内外都能访问,无需额外传参。 - 结构体
str:把“性别”和“身高”两个关联数据封装在一起,方便批量存储和排序。 - 数组
a[50]:用数组存储所有人的信息,下标从1开始(符合日常计数习惯)。
3. 自定义排序规则函数 cmp
bool cmp(str x, str y) { // 排序的核心规则:返回true则x排在y前面
// 规则1:男生永远在女生左边
if (x.s == "male" && y.s == "female") return 1; // 1=真,x(男)排y(女)前
if (x.s == "female" && y.s == "male") return 0; // 0=假,x(女)不排y(男)前
// 规则2:同性别时,男生升序(矮→高),女生降序(高→矮)
if (x.s == "male") return x.t < y.t; // 男生:x身高 < y身高 → x排前(矮的在前)
else return x.t > y.t; // 女生:x身高 > y身高 → x排前(高的在前)
}
这是代码的核心逻辑,需要重点理解:
sort函数默认按“升序”排序,但这里通过cmp函数自定义排序规则。cmp(x,y)的返回值决定x和y的相对位置:- 返回
true:x排在y左边; - 返回
false:y排在x左边。
- 返回
- 规则拆解:
- 先区分性别:男生和女生比较时,男生必在左,女生必在右;
- 再同性别排序:男生内部按身高从矮到高,女生内部按身高从高到矮。
4. 主函数(程序执行入口)
int main () {
// 第一步:输入数据
cin >> n; // 读取总人数n
for (int i = 1;i <= n;i++) { // 循环n次,读取每个人的信息
cin >> a[i].s >> a[i].t; // 读取第i人的“性别”和“身高”,存入结构体数组
}
// 第二步:按自定义规则排序
sort (a + 1, a + n + 1, cmp); // 对a[1]到a[n]的元素,按cmp规则排序
// 注:sort的参数是“起始地址”和“结束地址的下一位”,所以是a+1到a+n+1
// 第三步:输出排序结果
for (int i = 1;i <= n;i++) { // 循环输出每个人的身高
printf ("%.2lf ", a[i].t); // 保留2位小数,输出身高,末尾加空格
}
return 0; // 程序正常结束
}
主函数的执行流程是“输入→排序→输出”,逐行解释:
- 输入部分:
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位小数的浮点数”,末尾加空格分隔。- 循环输出排序后的所有身高,即最终的排队结果。
结合样例理解执行过程
输入样例:
6
male 1.72 → a[1] = {"male", 1.72}
male 1.78 → a[2] = {"male", 1.78}
female 1.61→ a[3] = {"female", 1.61}
male 1.65 → a[4] = {"male", 1.65}
female 1.70→ a[5] = {"female", 1.70}
female 1.56→ a[6] = {"female", 1.56}
排序前数组a的身高:[1.72, 1.78, 1.61, 1.65, 1.70, 1.56]
执行sort后,按cmp规则排序:
- 男生(a1、a2、a4)排左边,按身高升序:1.65(a4)→1.72(a1)→1.78(a2);
- 女生(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平台会忽略,但严格符合题目要求的话可以修改:
// 替换原输出循环
for (int i = 1;i <= n;i++) {
if (i > 1) cout << " "; // 非第一个数,先输出空格
printf ("%.2lf", a[i].t); // 再输出数值,无末尾空格
}
总结
这份代码的核心思路是:
- 用结构体封装“性别+身高”,方便批量处理;
- 自定义排序规则,优先区分男女位置,再按身高排序;
- 输入→排序→输出,流程清晰,贴合题目要求。
代码的每一部分都围绕“实现排队规则”展开,结构体和自定义排序是关键,也是C++处理这类“多条件排序”问题的典型写法。

这里空空如也






有帮助,赞一个