问题描述
思路
二维前缀和
定义一个二维数组s[][]
, s[i][j]
表示二维数组中,左上角(1, 1)
到右下角(i, j)
所包围的矩阵元素的和。
则以(xl,yl)
为左上角和以(xr,yr)
为右下角的矩阵的元素的和可以表示为:
s[xr, yr] - s[xl - 1, yr] - s[xr, yl - 1] + s[xl - 1, yl - 1]
完整代码
#include<iostream>
using namespace std;
int A[601][601];
int sum[601][601]; //二维前缀和
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 xl, xr, yl, yr;
int andu, counter = 0;
float avg_andu;
for( int i = 1; i <= n; i++)
{
for( int j = 1; j <= n; j++)
{
xl = i - r >= 1 ? i - r : 1;
xr = i + r <= n ? i + r : n;
yl = j - r >= 1 ? j - r : 1;
yr = j + r <= n ? j + r : n;
andu = sum[xr][yr] - sum[xl-1][yr] - sum[xr][yl-1] + sum[xl-1][yl-1];
avg_andu = (float)andu/((xr-xl+1)*(yr-yl+1)); //边界情况可能不是(2r+1)^2个数!!
if( avg_andu <= t)
counter++;
}
}
cout << counter;
return 0;
}