惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
博客园 - 司徒正美
博客园 - Franky
Jina AI
Jina AI
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
C
Cybersecurity and Infrastructure Security Agency CISA
IT之家
IT之家
S
Schneier on Security
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cloudbric
Cloudbric
博客园 - 聂微东
S
Secure Thoughts
人人都是产品经理
人人都是产品经理
Attack and Defense Labs
Attack and Defense Labs
月光博客
月光博客
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Heimdal Security Blog
L
Lohrmann on Cybersecurity
博客园 - 三生石上(FineUI控件)
博客园_首页
V2EX - 技术
V2EX - 技术
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
F
Full Disclosure
宝玉的分享
宝玉的分享
Microsoft Security Blog
Microsoft Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
量子位
Simon Willison's Weblog
Simon Willison's Weblog
A
About on SuperTechFans
O
OpenAI News
爱范儿
爱范儿
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Palo Alto Networks Blog
Forbes - Security
Forbes - Security
N
News and Events Feed by Topic
I
InfoQ
L
LINUX DO - 热门话题
博客园 - 【当耐特】

OneCoder

【NOIP】2015真题解析 luogu-P2678 跳石头(适合GESP六级以上练习) 【GESP】C++六级练习 luogu-B2174, 完全背包 【NOIP】2005真题解析 luogu-P1048 采药(适合GESP六级以上练习) 【GESP】C++六级真题 luogu-P17013, [GESP202606 六级] 满二叉树 【GESP】C++六级真题 luogu-P17012, [GESP202606 六级] 条形蛋糕 【GESP】C++五级真题 luogu-P17011 [GESP202606 五级] 晚宴 【GESP】C++五级真题 luogu-P17010 [GESP202606 五级] 排排坐 【GESP】C++四级真题 luogu-B4557 [GESP202606 四级] 扫雷 【GESP】C++三级真题 luogu-B4556 [GESP202606 三级] 字符转换 【GESP】C++三级真题 luogu-B4555 [GESP202606 三级] 加密 【GESP】C++二级真题 luogu-B4554 [GESP202606 二级] 菱形 【GESP】C++二级真题 luogu-B4553 [GESP202606 二级] 完全平方数计数 【GESP】C++一级真题 luogu-B4551 [GESP202606 一级] 去旅行 【GESP】C++一级真题 luogu-B4552 [GESP202606 一级] 交税 【NOIP】2000真题解析 luogu-P1023 税收与补贴问题(适合GESP四、五级以上练习) 【NOIP】2000真题解析 luogu-P1022 计算器的改良(适合GESP四、五级以上练习) 【NOIP】2001真题解析 luogu-P1029 最大公约数和最小公倍数问题 【CSP】CSP-X 2018真题 11的倍数 luogu-B4075 (适合GESP三级及以上考生练习) 【CSP】CSP-X 2018真题 统计成绩 luogu-B4074 (适合GESP二级及以上考生练习) 【CSP】CSP-X 2018真题 快递费用 luogu-B4073 (适合GESP二级及以上考生练习) 【CSP】CSP-X 2018真题 小明的照片 luogu-B4072 (适合GESP一级及以上考生练习) 【GESP】C++四级练习 luogu-P1138 第 k 小整数 【NOIP】2008真题解析 luogu-P1125 笨小猴 【信奥业余科普】C++ 的奇妙之旅 29:别让 TLE 和 MLE 偷走你的分——复杂度估算与数据范围速查 【信奥业余科普】C++ 的奇妙之旅 28:规范比赛代码的钥匙——文件操作与输入输出重定向(freopen) 【CSP】CSP-J 2023真题 公路 luogu-P9749 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 27:高效处理数据的利器——常用算法库(algorithm) 【CSP】CSP-J 2022真题 解密 luogu-P8814 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 26:高效的键值对——映射(map)与多重映射(multimap) 【CSP】CSP-J 2022真题 乘方 luogu-P8813 (适合GESP二级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 25:自动排序的利器——集合(set)与多重集合(multiset) 【CSP】CSP-J 2019真题 纪念品 luogu-P5662 (适合GESP六级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 24:拆解 deque——分段连续的双端队列 【信奥业余科普】C++ 的奇妙之旅 23:主动限制的艺术——栈(stack)与队列(queue)
【GESP】C++四级真题 luogu-B4558 [GESP202606 四级] 身高体重指数
OneCoder · 2026-07-05 · via OneCoder

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

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

题目要求

题目描述

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

例如,一个体重为 $50\text{ kg}$,身高为 $1.6\text{ m}$ 的人的身高体重指数为 $50\text{ kg}/1.6\text{ m}/1.6\text{ m} = 19.53125\text{ kg/m}^2$。

现在有 $n$ 个小朋友,第 $i$ 个小朋友的编号为 $i$,体重为 $w_i$,身高为 $h_i$。

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

输入格式

输入 $3$ 行,

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

第二行为 $n$ 个整数 $w_1, w_2, \cdots, w_n$ 表示小朋友们的体重,单位为 $\text{kg}$;

第三行为 $n$ 个浮点数 $h_1, h_2, \cdots, h_n$ 表示小朋友们的身高,单位为 $\text{m}$。

输出格式

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

输入输出样例 #1

输入 #1

1
2
3
3
45 33 39
1.55 1.33 1.44

输出 #1

说明/提示

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

数据范围

$1 \le n \le 1000$,$10 \le w_i \le 100$,$0.8 \le h_i \le 1.9$,$h_i$ 均恰有两位小数。


题目分析

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

1. BMI 计算

BMI 的公式为:

\[BMI = \frac{w}{h^2}\]

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

2. 排序策略

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

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

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

3. 自定义比较函数

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

4. 复杂度分析

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

示例代码

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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;
}


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

GESP 学习专题站:GESP WIKI

"luogu-"系列题目可在洛谷题库进行在线评测。

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

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号

GESP/CSP 认证学习微信公众号