题目和样例自行搜索
题目分析:首先得知道什么是邻域,例如样例1
4 16 1 6
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
由于r是1,因此5的邻域是
0 1 2
4 5 6
8 9 10
因此计算邻域中的元素和,只需要知道邻域矩阵四角的坐标即可
思路:先二维前缀和预处理再进行计算
简单了解二维前缀和请移步
二维前缀和详解
#include <bits/stdc++.h>
using namespace std;
int sum[601][601];
int main(){
ios::sync_with_stdio(false);
int n,l,r,t;
cin>>n>>l>>r>>t;
int temp=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>temp;
sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+temp;//状态转移方程
}
}
int cnt=0;
for(int i=1;i<=n;i++){//将邻域转化为矩阵的形式 (mini,minj) (maxi,maxj)为这一位置邻域矩阵的边界
for(int j=1;j<=n;j++){
int minj=max(j-r,1)-1,maxj=min(j+r,n);
int mini=max(i-r,1)-1,maxi=min(i+r,n);
int all=sum[maxi][maxj]-sum[maxi][minj]-sum[mini][maxj]+sum[mini][minj];//邻域中全部元素的和
int num=(maxi-mini)*(maxj-minj);//矩阵中元素数量
if(all<=t*num) cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
代码中int minj=max(j-r,1)-1,这个-1的解释如下
计算上面样例10的邻域时,maxi=4,maxj=4,mini=1,minj=1
int all=总矩阵元素和-邻域左边-邻域上边+重复减的区域
-1能保证邻域左右都能被减去
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15