202512-黄金格
GESP C++ 2025年12月,二级真题第二题,考察循环语句应用,涉及到多重循环,比第一题略难比较简单。题目难度⭐☆☆☆☆。
第二题,黄金格
题目要求
题目描述

题目分析
1. 核心逻辑
本题要求在一个 的网格中,统计满足特定不等式的格子 数量。核心在于对不等式 的处理。
2. 处理技巧:消除根号
在编程中直接使用 sqrt 函数会引入浮点数精度误差,可能导致判断失误。为了保证结果准确,通常将不等式两边进行平方处理。
- 原式:
- 平方后:
3. 注意事项
- 判定前提:只有当右侧 时,两边平方才等价。如果右侧为负数,由于左侧根号结果一定是非负数,该不等式必然不成立。
- 溢出风险:计算平方值 或 时,结果可能超过
int的范围,因此需要使用long long类型进行运算。(当然本题没有) - 遍历范围:使用双重循环遍历 和 即可,复杂度为 。
示例代码
#include <iostream>
/**
* GESP 2025年12月 二级编程题 T2: 黄金格
*
* 题目核心:
* 在 H 行 W 列的地图中,统计满足不等式 sqrt(r^2 + c^2) <= x + r - c
* 的格子数量。
*
* 注意点:
* 1. 坐标 r 和 c 的范围分别是 [1, H] 和 [1, W]。
* 2. 为了避免 sqrt 带来的浮点数精度误差,我们可以将不等式两边平方进行比较。
* 平方的前提是不等式右边 (x + r - c) 必须大于等于 0。
* 因为左边是根号结果(非负),如果右边是负数,则不等式一定不成立。
*/
int main() {
int h, w, x;
// 输入 h, w, x 分别占三行
std::cin >> h >> w >> x;
int count = 0;
// 双重循环遍历所有格子 (r, c)
for (int r = 1; r <= h; r++) {
for (int c = 1; c <= w; c++) {
// 计算不等式右边的值
long long rhs = (long long)x + r - c;
// 只有当右边 rhs >= 0 时,平方后的比较才有效
if (rhs >= 0) {
// 左边平方:r^2 + c^2
long long left_sq = (long long)r * r + (long long)c * c;
// 右边平方:(x + r - c)^2
long long right_sq = rhs * rhs;
// 比较平方值
if (left_sq <= right_sq) {
count++;
}
}
}
}
// 输出满足条件的格子总数
std::cout << count;
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 认证学习微信公众号

最后更新于