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

推荐订阅源

博客园 - 【当耐特】
K
Kaspersky official blog
V
Vulnerabilities – Threatpost
Hacker News - Newest:
Hacker News - Newest: "LLM"
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Secure Thoughts
I
Intezer
TaoSecurity Blog
TaoSecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Spread Privacy
Spread Privacy
A
About on SuperTechFans
NISL@THU
NISL@THU
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
S
SegmentFault 最新的问题
G
Google Developers Blog
B
Blog
N
News and Events Feed by Topic
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
V
Visual Studio Blog
MyScale Blog
MyScale Blog
Webroot Blog
Webroot Blog
Vercel News
Vercel News
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
S
Security Affairs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
博客园 - 叶小钗
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
T
Tailwind CSS Blog
F
Fortinet All Blogs
D
DataBreaches.Net
博客园 - Franky
博客园_首页
H
Heimdal Security Blog
宝玉的分享
宝玉的分享
阮一峰的网络日志
阮一峰的网络日志
Attack and Defense Labs
Attack and Defense Labs
Project Zero
Project Zero
雷峰网
雷峰网

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 认证学习微信公众号