2026年6月GESP真题及题解(C++四级):身高体重指数
2026年6月GESP真题及题解(C++四级):身高体重指数

题目描述
一个人的身高体重指数(BMI)等于其体重(千克为单位)除以其身高(米为单位)的平方。
例如,一个体重为 50 kg 50\text{ kg} 50 kg,身高为 1.6 m 1.6\text{ m} 1.6 m 的人的身高体重指数为 50 kg / 1.6 m / 1.6 m = 19.53125 kg/m 2 50\text{ kg}/1.6\text{ m}/1.6\text{ m} = 19.53125\text{ kg/m}^2 50 kg/1.6 m/1.6 m=19.53125 kg/m2。
现在有 n n n 个小朋友,第 i i i 个小朋友的编号为 i i i,体重为 w i w_i wi,身高为 h i h_i hi。
请按照身高体重指数从高到低为小朋友们排序,数据保证不存在两个小朋友的身高体重指数完全相同。输出排序后小朋友的编号。
输入格式
输入 3 3 3 行,
第一行为一个正整数 n n n,表示小朋友的个数;
第二行为 n n n 个整数 w 1 , w 2 , ⋯ , w n w_1, w_2, \cdots, w_n w1,w2,⋯,wn 表示小朋友们的体重,单位为 kg \text{kg} kg;
第三行为 n n n 个浮点数 h 1 , h 2 , ⋯ , h n h_1, h_2, \cdots, h_n h1,h2,⋯,hn 表示小朋友们的身高,单位为 m \text{m} m。
输出格式
输出一行 n n n 个数,表示按照身高体重指数从高到低排序后的编号。
输入输出样例 1
输入 1
3
45 33 39
1.55 1.33 1.44
输出 1
3 1 2
说明/提示
样例解释
三个小朋友(编号依次为 1 1 1, 2 2 2, 3 3 3)的身高体重指数分别为(保留两位小数的结果): 18.73 18.73 18.73, 18.66 18.66 18.66, 18.81 18.81 18.81,故排序后输出的编号为 3 1 2 3\ 1\ 2 3 1 2。
数据范围
1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000, 10 ≤ w i ≤ 100 10 \le w_i \le 100 10≤wi≤100, 0.8 ≤ h i ≤ 1.9 0.8 \le h_i \le 1.9 0.8≤hi≤1.9, h i h_i hi 均恰有两位小数。
思路分析
-
问题转化
对每个小朋友(编号从 1 开始)计算 BMI = 体重 / 身高²,然后按 BMI 从高到低排序,输出对应编号。
题目保证所有 BMI 值互不相同,因此排序时无需处理相等情况。 -
数据存储
- 体重为整数,身高为浮点数(两位小数)。
- 由于输入先给所有体重再给所有身高,需先保存体重数组。
- 读入每个身高时立即计算 BMI,并将编号与 BMI 存入结构体数组。
-
排序方法
使用sort配合自定义比较函数,按 BMI 降序排列。 -
输出格式
依次输出排序后的编号,每个编号后跟一个空格(末尾多余空格不影响评测)。 -
复杂度
- 时间:O(n log n),n ≤ 1000。
- 空间:O(n)。
代码实现
#include <bits/stdc++.h>
using namespace std;
int n;
int w[1010]; // 体重数组
struct node{
int id;
double b;
}a[1005]; // 编号与BMI
bool cmp(node x, node y){
return x.b > y.b; // 降序比较
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> w[i];
double h; // 临时身高变量
for (int i = 1; i <= n; i++) {
cin >> h; // 读入身高
a[i].id = i; // 记录编号
a[i].b = w[i] / (h * h); // 计算BMI
}
sort(a + 1, a + n + 1, cmp); // 按BMI降序排序
for (int i = 1; i <= n; i++) {
cout << a[i].id << " "; // 输出编号
}
return 0;
}
功能分析
- 输入处理:从标准输入读取 n、体重序列和身高序列。
- 计算逻辑:使用浮点除法得到精确 BMI 值,无精度损失。
- 排序稳定性:比较函数直接返回降序,确保排序结果唯一。
- 输出:按顺序输出编号,每个编号后带空格。
各种学习资料,助力大家一站式学习和提升!!!
#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 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}

更多推荐
所有评论(0)