二维前缀和
二维前缀和的书写要点,本质类似于概率统计的分布函数。在写的时候,为了防止越界,从数组的第二位,即‘1’开始书写。这样便于进行计算。同理,一位的前缀和也是如此。
ccf邻域均值问题 如果用循环嵌套的话会造成超时,因此采用二维的前缀和来进行操作。
#include <iostream>
using namespace::std;
const int N = 610;
int main(int argc, const char * argv[]) {
// insert code here...
int n,l,r,t;
cin>>n>>l>>r>>t;
int matrix1[N][N];
for (int i=0; i<n; i++) {
for (int j = 0;j<n; j++)
{
int tmp;
cin>>tmp;
matrix1[i][j] = tmp;
}
}
int res = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
int total = 0;
int counter = 0;
total = 0 ;
counter = 0;
for (int k = max (0, i-r); k<=min(n-1,i+r); k++) {
for (int h = max(0,j-r); h<=min(n-1,j+r); h++) {
total+=matrix1[k][h];
counter++;
}
}
if (((total*1.0)/counter)<=t)
{
res++;
}
}
}
cout<<res;
return 0;
}
下面采用二维的前缀和进行优化。
#include <iostream>
#include <string>
using namespace std;
const int N = 610;
int main()
{
int n,l,t,r;
cin>>n>>l>>r>>t;
int mtr[N][N] = {0};
int res[N][N] = {0};
for (int i=1; i<=n;i++) {
for (int j=1; j<=n; j++)
{
cin>>mtr[i][j];
}
}
for(int i=1;i<=n;i++)
{
for (int j=1; j<=n; j++) {
res[i][j] = mtr[i][j] + res[i-1][j] + res[i][j-1] - res[i-1][j-1];//对于这个边界处理还是有点问题。
}
}
int counter = 0;
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
int total = 0;
int sum = 0;
total = 0;
sum = 0;
// total = res[i][j] - res[i-r-1][j] - res[i][j-r-1] + res[i-r][j-r];//这个total这样计算也会有问题,需要用x1,x2来进行代替
// int num = //这个地方边界的统计也是一个需要注意的点(如果这样单纯的加的话貌似肥肠麻烦)因此利用y总的做法,
int x1 = max(1,i-r), x2 = min(n, i+r);
int y1 = max(1,j-r),y2 = min(n,j+r);
total = res[x2][y2] - res[x1-1][y2] - res[x2][y1-1] + res[x1-1][y1-1];
sum = (x2-x1+1)*(y2-y1+1);
if ((total*1.0/sum)<=t) {
counter++;
}
}
}
cout<<counter;
return 0;
}