1.暴力解法:70分
//暴力解法:四重for循环---70
public static void main(String[] args) {
int count=0;
Scanner sc=new Scanner(System.in);
// int n=4,L=16,r=1,t=6;
// int[][] nums=new int[][] {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
int n=sc.nextInt();
int L=sc.nextInt();
int r=sc.nextInt();
int t=sc.nextInt();
int[][] nums=new int[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
nums[i][j]=sc.nextInt();
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(getAverage(nums, r,t, i, j))count++;
}
}
System.out.println(count);
}
//双重for循环求nums[0][0]~nums[raw][col]的总和 与 count* t比较
public static boolean getAverage(int[][] nums,int r,int t,int raw,int col) {
int count=0;
int sum=0;
for(int i=raw-r;i<=raw+r;i++) {
for(int j=col-r;j<=col+r;j++) {
if(i<0||j<0||i>=nums.length||j>=nums[i].length)continue;
//i或j处于边界时,跳过
sum+=nums[i][j];
count++;
}
}
// System.out.println(sum+" "+count+" "+sum+" "+count*t);
if(sum<=count*t) return true;
else return false;
}
2.二维前缀和:100分
//二维前缀和
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int L=sc.nextInt();
int r=sc.nextInt();
int t=sc.nextInt();
// int n=4,L=16,r=1,t=6;
int[][] nums=new int[n+2][n+2];
int[][] sum=new int[n+2][n+2];//二维前缀和数组
int result=0;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
nums[i][j]=sc.nextInt();
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+nums[i][j];
//二维前缀和经典公式,这里不懂的话建议上网查或b站视频
}
}
// for(int i=1;i<=n;i++) {
// for(int j=1;j<=n;j++) {
// System.out.print(sum[i][j]+" ");
// }
// System.out.println();
// }
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
int iMin=Math.max(1, i-r);//i的最上界
int iMax=Math.max(n, i+r);//i的最下界
int jMin=Math.max(1, j-r);//j的最上届
int jMax=Math.max(n, j+r);//j的最下届
int count=(iMax-iMin+1)*(jMax-jMin+1);//矩形里符合的元素个数
int temp=sum[iMax][jMax]-sum[iMax][jMin-1]-sum[iMin-1][jMax]+sum[iMin-1][jMin-1];
if(temp<=count*t) {result++;}
}
}
System.out.println(result);
}
}
PS:做这道题的时候我也是忘了二维前缀和,就去b站找了视频来看,如果也是小伙伴不懂二维前缀和的话,这里我推荐 二维前缀和