2025 年 12 月 GESP 二级 C++ T2 黄金格
题目描述
小杨在探险时发现了一张神奇的矩形地图,地图有 $H$ 行和 $W$ 列。每个格子的坐标是 $(r, c)$,其中 $r$ 表示行号从 1 到 $H$,$c$ 表示列号从 1 到 $W$。
小杨听说地图中隐藏着一些'黄金格',这些格子满足一个神秘的数学挑战:当格子坐标 $(r, c)$ 代入特定的不等式关系成立时,该格子就是黄金格。具体来说,黄金格的条件是:$ \sqrt{r^2 + c^2} \leq x + r - c$。
例如,如果参数 $x=5$,那么格子 $(4, 3)$ 就是黄金格。因为左边坐标平方和的平方根 $ \sqrt{4^2 + 3^2}$ 算出来是 5,而右边 $5 + 4 - 3$ 算出来是 6,5 小于等于 6,符合条件。
输入格式
三行,每行一个正整数,分别表示 $H, W, x$。含义如题面所示。
输出格式
一行一个整数,代表黄金格数量。
输入输出样例 #1
输入 #1
4 4 2
输出 #1
4
说明/提示
样例解释

图中标注为黄色的四个格子是黄金格,坐标分别为 $(1, 1)$,$(2, 1)$,$(3, 1)$,$(4, 1)$。
数据范围
对于所有测试点,保证给出的正整数不超过 1000。
题解
一、题目分析
1. 核心需求
给定一个 $H$ 行 $W$ 列的矩形地图,每个格子坐标为 $(r, c)$($1 \leq r \leq H$,$1 \leq c \leq W$),统计满足黄金格条件的格子数量。黄金格的原始条件为:
$
\sqrt{r^2 + c^2} \leq x + r - c$
2. 关键优化:避免浮点数精度误差
原始条件包含平方根运算,若直接使用 sqrt 函数计算,会引入浮点数存储和计算的精度误差(例如,某些本应成立的条件可能因精度丢失被判为不成立,反之亦然)。
由于不等式两边均为非负数(左边 $
\sqrt{r^2 + c^2}$ 必然非负;若右边 $x + r - c < 0$,则不等式一定不成立,无需判断),因此可对两边同时平方,转化为等价的整数运算不等式,完全规避精度问题:
$r^2 + c^2 \leq (x + r - c)^2$
二、解题思路
- 输入读取:读取三个正整数 $H$(行数)、$W$(列数)、$x$(题目参数)。
- 计数器初始化:定义计数器
cnt并初始化为 0,用于统计黄金格数量。 - 遍历所有格子:使用双重循环遍历所有格子坐标 $(r, c)$(外层循环遍历行 $r$,内层循环遍历列 $c$)。
- 条件判断:对每个格子,验证转化后的整数不等式是否成立,若成立则计数器
cnt加 1。 - 输出结果:循环结束后,输出计数器
cnt的值,即黄金格总数。
三、代码解析
std;
{
h, w, x;
cnt = ;
cin >> h >> w >> x;
( r = ; r <= h; r++) {
( c = ; c <= w; c++) {
(r * r + c * c <= (x + r - c) * (x + r - c)) {
cnt++;
}
}
}
cout << cnt;
;
}

