B4558 [GESP202606 四级] 身高体重指数题目描述一个人的身高体重指数BMI等于其体重千克为单位除以其身高米为单位的平方。例如一个体重为50 kg50\text{ kg}50kg身高为1.6 m1.6\text{ m}1.6m的人的身高体重指数为50 kg/1.6 m/1.6 m19.53125 kg/m250\text{ kg}/1.6\text{ m}/1.6\text{ m} 19.53125\text{ kg/m}^250kg/1.6m/1.6m19.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输入 #13 45 33 39 1.55 1.33 1.44输出 #13 1 2说明/提示样例解释三个小朋友编号依次为111222333的身高体重指数分别为保留两位小数的结果18.7318.7318.7318.6618.6618.6618.8118.8118.81故排序后输出的编号为3 1 23\ 1\ 2312。数据范围1≤n≤10001 \le n \le 10001≤n≤100010≤wi≤10010 \le w_i \le 10010≤wi≤1000.8≤hi≤1.90.8 \le h_i \le 1.90.8≤hi≤1.9hih_ihi均恰有两位小数。题解本题要求计算每个小朋友的 BMI体重/身高²并按 BMI 从高到低排序输出编号。我采用结构体存储每个小朋友的编号、体重、身高和计算出的 BMI。先读入所有体重再读入身高读身高时同时计算 BMI 并记录编号。然后使用sort函数自定义比较规则cmp实现按 BMI 降序排列最后依次输出排序后的编号。关键点体重为整数身高为浮点数计算时整数会自动转换为浮点数进行除法因此结果精确。数据保证 BMI 互不相同无需处理并列情况。时间复杂度O(n log n)n ≤ 1000完全可行。带注释的源代码#includebits/stdc.husingnamespacestd;intn;// 定义结构体存储每个小朋友的信息structnode{intid;// 小朋友编号intw;// 体重kgdoubleh;// 身高mdoublebmi;// 身高体重指数};node a[1005];// 存储所有小朋友下标从1开始// 自定义排序规则按 BMI 从高到低排序boolcmp(node x,node y){returnx.bmiy.bmi;}intmain(){cinn;// 读入小朋友个数// 先读入所有体重for(inti1;in;i){cina[i].w;}// 再读入所有身高同时计算 BMI 并记录编号for(inti1;in;i){cina[i].h;a[i].idi;// 编号等于输入顺序a[i].bmia[i].w/a[i].h/a[i].h;// 计算 BMI 体重 / 身高^2}// 按 BMI 降序排序sort(a1,an1,cmp);// 输出排序后的编号for(inti1;in;i){couta[i].id ;}return0;}
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 m19.53125 kg/m250\text{ kg}/1.6\text{ m}/1.6\text{ m} 19.53125\text{ kg/m}^250kg/1.6m/1.6m19.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输入 #13 45 33 39 1.55 1.33 1.44输出 #13 1 2说明/提示样例解释三个小朋友编号依次为111222333的身高体重指数分别为保留两位小数的结果18.7318.7318.7318.6618.6618.6618.8118.8118.81故排序后输出的编号为3 1 23\ 1\ 2312。数据范围1≤n≤10001 \le n \le 10001≤n≤100010≤wi≤10010 \le w_i \le 10010≤wi≤1000.8≤hi≤1.90.8 \le h_i \le 1.90.8≤hi≤1.9hih_ihi均恰有两位小数。题解本题要求计算每个小朋友的 BMI体重/身高²并按 BMI 从高到低排序输出编号。我采用结构体存储每个小朋友的编号、体重、身高和计算出的 BMI。先读入所有体重再读入身高读身高时同时计算 BMI 并记录编号。然后使用sort函数自定义比较规则cmp实现按 BMI 降序排列最后依次输出排序后的编号。关键点体重为整数身高为浮点数计算时整数会自动转换为浮点数进行除法因此结果精确。数据保证 BMI 互不相同无需处理并列情况。时间复杂度O(n log n)n ≤ 1000完全可行。带注释的源代码#includebits/stdc.husingnamespacestd;intn;// 定义结构体存储每个小朋友的信息structnode{intid;// 小朋友编号intw;// 体重kgdoubleh;// 身高mdoublebmi;// 身高体重指数};node a[1005];// 存储所有小朋友下标从1开始// 自定义排序规则按 BMI 从高到低排序boolcmp(node x,node y){returnx.bmiy.bmi;}intmain(){cinn;// 读入小朋友个数// 先读入所有体重for(inti1;in;i){cina[i].w;}// 再读入所有身高同时计算 BMI 并记录编号for(inti1;in;i){cina[i].h;a[i].idi;// 编号等于输入顺序a[i].bmia[i].w/a[i].h/a[i].h;// 计算 BMI 体重 / 身高^2}// 按 BMI 降序排序sort(a1,an1,cmp);// 输出排序后的编号for(inti1;in;i){couta[i].id ;}return0;}