CCF-GESP计算机学会等级考试2026年6月四级C++T2 身高体重指数

CCF-GESP计算机学会等级考试2026年6月四级C++T2 身高体重指数

B4558 [GESP202606 四级] 身高体重指数

题目描述

一个人的身高体重指数(BMI)等于其体重(千克为单位)除以其身高(米为单位)的平方。

例如,一个体重为50 kg50\text{ kg}50kg,身高为1.6 m1.6\text{ m}1.6m的人的身高体重指数为50 kg/1.6 m/1.6 m=19.53125 kg/m250\text{ kg}/1.6\text{ m}/1.6\text{ m} = 19.53125\text{ kg/m}^250kg/1.6m/1.6m=19.53125kg/m2

现在有nnn个小朋友,第iii个小朋友的编号为iii,体重为wiw_iwi,身高为hih_ihi

请按照身高体重指数从高到低为小朋友们排序,数据保证不存在两个小朋友的身高体重指数完全相同。输出排序后小朋友的编号。

输入格式

输入333行,

第一行为一个正整数nnn,表示小朋友的个数;

第二行为nnn个整数w1,w2,⋯ ,wnw_1, w_2, \cdots, w_nw1,w2,,wn表示小朋友们的体重,单位为kg\text{kg}kg

第三行为nnn个浮点数h1,h2,⋯ ,hnh_1, h_2, \cdots, h_nh1,h2,,hn表示小朋友们的身高,单位为m\text{m}m

输出格式

输出一行nnn个数,表示按照身高体重指数从高到低排序后的编号。

输入输出样例 #1

输入 #1

3 45 33 39 1.55 1.33 1.44

输出 #1

3 1 2

说明/提示

样例解释

三个小朋友(编号依次为111222333)的身高体重指数分别为(保留两位小数的结果):18.7318.7318.7318.6618.6618.6618.8118.8118.81,故排序后输出的编号为3 1 23\ 1\ 2312

数据范围

1≤n≤10001 \le n \le 10001n100010≤wi≤10010 \le w_i \le 10010wi1000.8≤hi≤1.90.8 \le h_i \le 1.90.8hi1.9hih_ihi均恰有两位小数。

题解

本题要求计算每个小朋友的 BMI(体重/身高²),并按 BMI 从高到低排序输出编号。
我采用结构体存储每个小朋友的编号、体重、身高和计算出的 BMI。
先读入所有体重,再读入身高,读身高时同时计算 BMI 并记录编号。
然后使用sort函数,自定义比较规则cmp实现按 BMI 降序排列,最后依次输出排序后的编号。

关键点:体重为整数,身高为浮点数,计算时整数会自动转换为浮点数进行除法,因此结果精确。数据保证 BMI 互不相同,无需处理并列情况。
时间复杂度O(n log n),n ≤ 1000,完全可行。


带注释的源代码

#include<bits/stdc++.h>usingnamespacestd;intn;// 定义结构体,存储每个小朋友的信息structnode{intid;// 小朋友编号intw;// 体重(kg)doubleh;// 身高(m)doublebmi;// 身高体重指数};node a[1005];// 存储所有小朋友,下标从1开始// 自定义排序规则:按 BMI 从高到低排序boolcmp(node x,node y){returnx.bmi>y.bmi;}intmain(){cin>>n;// 读入小朋友个数// 先读入所有体重for(inti=1;i<=n;i++){cin>>a[i].w;}// 再读入所有身高,同时计算 BMI 并记录编号for(inti=1;i<=n;i++){cin>>a[i].h;a[i].id=i;// 编号等于输入顺序a[i].bmi=a[i].w/a[i].h/a[i].h;// 计算 BMI = 体重 / 身高^2}// 按 BMI 降序排序sort(a+1,a+n+1,cmp);// 输出排序后的编号for(inti=1;i<=n;i++){cout<<a[i].id<<" ";}return0;}