202606-身高体重指数(luogu-B4558)

202606-身高体重指数(luogu-B4558)

GESP C++四级2026年6月真题。本题主要考查结构体排序(或间接排序),需要根据计算出的 BMI 值对编号进行降序排列。难度⭐⭐。本题在洛谷评定为普及-

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

题目要求

题目描述

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

例如,一个体重为 50 kg50\text{ kg},身高为 1.6 m1.6\text{ m} 的人的身高体重指数为 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}^2

现在有 nn 个小朋友,第 ii 个小朋友的编号为 ii,体重为 wiw_i,身高为 hih_i

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

输入格式

输入 33 行,

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

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

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

输出格式

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

输入输出样例 #1

输入 #1
3
45 33 39
1.55 1.33 1.44
输出 #1
3 1 2

说明/提示

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

数据范围

1n10001 \le n \le 100010wi10010 \le w_i \le 1000.8hi1.90.8 \le h_i \le 1.9hih_i 均恰有两位小数。


题目分析

本题考察对结构体(或并行数组)进行自定义排序的能力。核心思路是:计算每个小朋友的 BMI 值,然后按照 BMI 值从高到低排序,最后输出排序后的编号。

1. BMI 计算

BMI 的公式为:

BMI=wh2BMI = \frac{w}{h^2}

其中 ww 为体重(kg),hh 为身高(m)。注意身高是浮点数,BMI 的计算结果也是浮点数,需要使用 double 类型存储以保证精度。

2. 排序策略

排序的关键在于:我们需要对编号进行排序,而排序的依据是每个编号对应的 BMI 值。这种「按某个属性对另一组数据排序」的问题,常见的实现方式有两种:

  • 结构体排序:将编号、体重、身高(或计算好的 BMI)打包到一个结构体中,对结构体数组排序
  • 间接排序(索引排序):维护一个编号数组,对编号数组排序时,通过编号去查询对应的 BMI 值作为比较依据

两种方式本质相同,下面的示例代码采用结构体 + 自定义比较函数的方式。

3. 自定义比较函数

sort 函数默认按升序排列。本题要求按 BMI 从高到低排序,因此需要自定义比较函数,使得 BMI 较大的排在前面。

4. 复杂度分析

  • 时间复杂度:读入数据 O(n)O(n),计算 BMI O(n)O(n),排序 O(nlogn)O(n \log n),总体 O(nlogn)O(n \log n)
  • 空间复杂度:存储结构体数组 O(n)O(n)

示例代码

使用结构体存储每个小朋友的编号和 BMI 值,通过自定义比较函数实现降序排序。

#include <iostream>
#include <algorithm>

// 结构体存储小朋友的编号和 BMI 值
struct Child {
    int id;       // 编号(从 1 开始)
    double bmi;   // 身高体重指数
};

// 自定义比较函数:按 BMI 从高到低排序
bool cmp(const Child &a, const Child &b) {
    return a.bmi > b.bmi;
}

int main() {
    int n;
    std::cin >> n;

    Child children[1005];
    int w[1005];
    double h[1005];

    // 读入体重
    for (int i = 1; i <= n; i++) {
        std::cin >> w[i];
    }
    // 读入身高
    for (int i = 1; i <= n; i++) {
        std::cin >> h[i];
    }

    // 计算每个小朋友的 BMI 并存入结构体
    for (int i = 1; i <= n; i++) {
        children[i].id = i;
        children[i].bmi = w[i] / (h[i] * h[i]);
    }

    // 按 BMI 从高到低排序
    std::sort(children + 1, children + 1 + n, cmp);

    // 输出排序后的编号
    for (int i = 1; i <= n; i++) {
        if (i > 1) {
            std::cout << " ";
        }
        std::cout << children[i].id;
    }
    std::cout << std::endl;
    return 0;
}

本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP认证交流QQ群: 688906745

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
最后更新于