二维数组的前缀和,真希望当时考试的时候我能写出来啊呜呜。
读完题,看完这篇博客,此题一写就会了
#include<iostream>
#include<string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
#include<cstring>
using namespace std;
const int N = 610;
int a[N][N];
int sum[N][N];
int main() {
int n, l, r, t;
cin >> n >> l >> r >> t;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
// 输入矩阵,计算前缀和
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
}
}
int count = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// 根据题目中给的表达式,确定范围,边界是 1 到 n
int a = max(1, i - r), b = max(1, j - r);
int c = min(n, i + r), d = min(n, j + r);
// 求子矩阵的大小
int s = sum[c][d] - sum[c][b - 1] - sum[a - 1][d] + sum[a - 1][b - 1];
// 求子矩阵元素的个数
int cnt = (c - a + 1) * (d - b + 1);
// 判断平均值
if (s <= t * cnt) {
count++;
}
}
}
cout << count;
}