202104-2 邻域均值

题目和样例自行搜索
题目分析:首先得知道什么是邻域,例如样例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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值