通过率 64% · 提交 426 · 通过 272
小慕有一块n * m的矩形土地,可以看作一个n行m列的,每个格子里的数值表示该小块土地的。现在小慕想要在这块土地上建设边长为c的正方形发电站,要求该正方形区域内所有格子的发电量之和至少达到目标电量k。请你帮小慕计算一下,有多少个不同的位置可以建设这样的发电站。
这类题属于华为 OD 机考真题方向中「200分 / 滑动窗口」方向的高频题型,通常考察对「200分 / 滑动窗口」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为四个按空格分隔的正整数,分别表示 n,m,c,k。后面 n 行整数,表示每个地块的发电量
输出满足条件的地块数量
示例 1
输入示例
2 5 2 6 1 3 4 5 8 2 3 6 7 1
输出示例
4
满足条件的地块有以下几种 第一种: 1 3 2 3 第二种: 3 4 3 6 第三种: 4 5 6 7 第四种: 5 8 7 1
示例 2
输入示例
4 5 2 6 1 3 4 5 8 2 3 6 7 1 1 3 4 5 8 2 3 6 7 1
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
本题的暴力解法是找到所有的 c*c 的地块并进行求和运算,这样的时间复杂度为 O(nmc²),在此不进行赘述。
由于地块的大小固定为 c*c,我们要搜索的其实是 grid 中所有大小为 c*c 的窗口中的值的和,这显然可以用 固定滑窗 的思路来完成,基本框架也为 滑窗三问三答。
但本题的难点在于,grid 是一个二维数组,c*c 的地块也是一个二维的滑窗,我们需要在两个方向上进行滑窗过程。
首先考虑 行方向(横向,向右) 的滑窗。以示例二为例,只考虑第一行的话,有如下滑窗过程:
上述过程可以由函数 slide_windows_in_row(grid, win_sum, i, m, c, k) 来实现,即:
除了行方向的滑窗,还需要考虑 列方向(纵向,向下) 的滑窗。同样以示例二为例,存在以下过程:
而每一个列方向的第一个窗口,都可以通过调用 slide_windows_in_row(grid, win_sum, i, m, c, k) 在行方向滑动。故代码为:
要注意,函数 slide_windows_in_row(grid, win_sum, i, m, c, k) 中的参数 i,为当前搜索地块 最上方那一行的行索引。
本解法和 经典题型、二维区域和检索 - 矩阵不可变 以及 【前缀和】2024E-最大子矩阵和 非常类似。
注意到我们要反复计算大小为 w*w 的子矩阵的和。
由于在 【前缀和】2024E-最大子矩阵和 中用 c 表示子矩阵的左边界,所以在本次讲解中我们换成变量 w 来表示子矩阵的固定边长。
为了避免反复地计算子矩阵和,我们考虑构建大小为 (n+1)*(m+1) 的 二维前缀和矩阵:
对于左上角索引为 (i, j),大小为 w*w 的子矩阵:
ii+w-1jj+w-1我们可以用以下公式算出其数字和:
或者更加直接地:
我们再加上关于 i 和 j 遍历的双重循环。由于 i 和 j 的范围分别为从 0 取到 n-w 和 m-w,则整个代码过程如下:
解法一:固定滑窗
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
12
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有