📷 题解插图【GESP】C++ 二级真题解析,[2025年12月,第十二次认证]第二题黄金格
📅 2025-12-27·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#真题#多重循环
GESP C++ 2025年12月,二级真题第二题,考察循环语句应用,涉及到多重循环,比第一题略难比较简单。题目难度⭐☆☆☆☆。
第二题,黄金格
题目要求
题目描述

题目分析
1. 核心逻辑
本题要求在一个 的网格中,统计满足特定不等式的格子 数量。核心在于对不等式 的处理。
2. 处理技巧:消除根号
在编程中直接使用 sqrt 函数会引入浮点数精度误差,可能导致判断失误。为了保证结果准确,通常将不等式两边进行平方处理。
- 原式:
- 平方后:
3. 注意事项
- 判定前提:只有当右侧 时,两边平方才等价。如果右侧为负数,由于左侧根号结果一定是非负数,该不等式必然不成立。
- 溢出风险:计算平方值 或 时,结果可能超过
int的范围,因此需要使用long long类型进行运算。(当然本题没有) - 遍历范围:使用双重循环遍历 和 即可,复杂度为 。
示例代码
CPP
#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;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!