![](https://i-blog.csdnimg.cn/blog_migrate/39f4439ccecff8c7942c5dee3cf8b173.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7e1886f9248674bcd71e0e070e022b7.png)
用二维差分解决
#include<iostream>
using namespace std;
int n, L, r, t;
int a[620][620] = { 0 };
int s[620][620] = { 0 };
int main() {
cin >> n >> L >> r >> t;
int i, j;
int num = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cin >> a[i][j];
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
}
}
int n1, n2, m1, m2;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
n1 = i - r >= 1 ? i - r : 1;
m1 = j - r >= 1 ? j - r : 1;
n2 = i + r <= n ? i + r : n;
m2 = j + r <= n ? j + r : n;
int sum = 0;
float ans;
sum = s[n2][m2] - s[n1 - 1][m2] - s[n2][m1 - 1] + s[n1 - 1][m1 - 1];
ans = sum*1.0 / ((n2 - n1 + 1) * (m2 - m1 + 1)*1.0); //注意分母的括号
if (ans <= t)num++;
}
}
cout << num;
return 0;
}
二刷
#include<bits/stdc++.h>
using namespace std;
int n, l, r, t;
int a[610][610] = { 0 };
int s[610][610] = { 0 };
int main() {
cin >> n >> l >> r >> t;
int i, j;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - s[i - 1][j - 1];
}
}
int cnt = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
//左上角
int x1, x2, y1, y2;
long long sum = 0;
double k = 0;
if (j - r >= 1 && i - r >= 1) {
x1 = i - r;
y1 = j - r;
}
else if (j - r < 1&&i-r>=1) {
x1 = i - r;
y1 = 1;
}
else if (j - r >= 1 && i - r < 1) {
x1 = 1;
y1 = j - r;
}
else {
x1 = 1;
y1 = 1;
}
//右下角
if (j + r<=n && i + r <=n) {
x2 = i + r;
y2 = j + r;
}
else if (j + r > n && i + r <= n) {
x2 = i + r;
y2 = n;
}
else if (j + r <= n && i + r > n) {
x2 = n;
y2 = j + r;
}
else {
x2 = n;
y2 = n;
}
sum = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
int num = (x2 - x1+1) * (y2 - y1+1);
k = (sum * 1.0) / (num * 1.0);
if (k <= t) {
cnt++;
}
}
}
cout << cnt;
}