202104-2 邻域均值( Java)

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站找了视频来看,如果也是小伙伴不懂二维前缀和的话,这里我推荐 二维前缀和

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值