原题链接:http://118.190.20.162/view.page?gpid=T127
领域均值
4 16 1 6
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
7
11 8 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 7 0 0 7 7 0 7 0 7 0 7 0 7 0 7 0 7 7 0 0 0 7 0 0 0 7 0 7 7 0 0 0 0 7 0 0 7 7 0 7 0 0 0 0 0 7 0 7 0 0 7 0 7 0 7 0 7 0 7 0 0 0 7 0 0 0 7 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
83
题解:最普通的思路,根据每一个(i,j), 按照给定的r, for for 循环暴力,不好意思,会超时,如下所示,这里要更正一下,实际超时这个代码,在当时考试的时候,只拿了30分,所以之前博客说的,模拟时间更长是错的
1 n,L,r,t=input().split() 2 n,L,r,t=int(n),int(L),int(r),int(t) 3 A=[list(map(int, input().split())) for _ in range(n)] 4 5 def get_all_point(p_x1,p_x2,p_y1,p_y2): 6 summ=0 7 count=0 8 for i in range(p_x1,p_x2+1): 9 for j in range(p_y1,p_y2+1): 10 summ+=A[i][j] 11 count+=1 12 13 if summ/count<=t: 14 # print(summ,count,end=' ') 15 return 1 16 else: 17 return 0 18 19 20 def get_coor(index1,r): 21 tmp1,tmp2=index1-r,index1+r 22 if tmp1<0: 23 tmp1=0 24 if tmp2>=n: 25 tmp2=n-1 26 return tmp1,tmp2 27 28 29 def main(): 30 res=0 31 for i in range(n): 32 for j in range(n): 33 p=(i,j) 34 p_x1,p_x2=get_coor(i,r) 35 p_y1,p_y2=get_coor(j,r) 36 temp=get_all_point(p_x1,p_x2,p_y1,p_y2) 37 res+=temp 38 print(res) 39 40 if __name__=="__main__": 41 main()
二维前缀和解法,而这里领域内的像素点个数,可以通过矩形面积来求解
1 if __name__=="__main__": 2 n,L,r,t=list(map(int, input().split())) 3 A=[[0]*n for _ in range(n)] 4 B=[[0]*n for _ in range(n)] 5 for i in range(n): 6 ans=list(map(int,input().split())) 7 for j in range(n): 8 left1=0 if j-r-1<0 else ans[j-r-1] 9 right1=0 if j+r>n-1 else ans[j+r] 10 if j>0: 11 A[i][j]=A[i][j-1]+right1-left1 12 else: 13 A[i][j]=sum(ans[:r+1]) 14 summ=0 15 for i in range(n): 16 for j in range(n): 17 right=n-1 if j+r>n-1 else j+r 18 up=0 if i-r<0 else i-r 19 left=0 if j-r<0 else j-r 20 bottom=n-1 if i+r>n-1 else i+r 21 if i>0: 22 u1=0 if i-r-1<0 else A[i-r-1][j] 23 b1=0 if i+r>n-1 else A[i+r][j] 24 B[i][j]=B[i-1][j]+b1-u1 25 else: 26 for k in range(r+1): 27 B[i][j]+=A[k][j] 28 29 if B[i][j]/((right-left+1)*(bottom-up+1)) <=t: 30 summ+=1 31 print(summ)
C++版本

1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <numeric> 5 #include <math.h> 6 using namespace std; 7 const int maxn=605; 8 int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn]; 9 10 int main(){ 11 ios::sync_with_stdio(0); 12 int n,L,r,t; 13 scanf("%d%d%d%d",&n,&L,&r,&t); 14 memset(A,0,sizeof(A)); 15 memset(B,0,sizeof(B)); 16 memset(C,0,sizeof(B)); 17 for(int i=0; i<n;i++) 18 for(int j=0; j<n;j++) 19 scanf("%d",&A[i][j]); 20 int left=0,right=0; 21 for(int i=0;i<n;i++){ 22 for(int j=0;j<n;j++){ 23 left=j-r-1<0?0:A[i][j-r-1]; 24 right=j+r>n-1?0:A[i][j+r]; 25 if(j>0) B[i][j]=B[i][j-1]+right-left; 26 else{ 27 for (int k=0;k<=r;k++) 28 B[i][j]+=A[i][k]; 29 } 30 31 } 32 } 33 34 left=0,right=0; 35 int summ=0,up=0,down=0,up1=0,down1=0; 36 for (int i=0;i<n;i++){ 37 for (int j=0;j<n;j++){ 38 up=i-r<0?0:i-r; 39 down=i+r>n-1?n-1:i+r; 40 left=j-r<0?0:j-r; 41 right=j+r>n-1?n-1:j+r; 42 if (i>0){ 43 up1=i-r-1<0?0:B[i-r-1][j]; 44 down1=i+r>n-1?0:B[i+r][j]; 45 C[i][j]=C[i-1][j]+down1-up1; 46 }else{ 47 for(int k=0;k<=r;k++) 48 C[i][j]+=B[k][j]; 49 } 50 float res=(double)C[i][j]/((right-left+1)*(down-up+1)); 51 // cout<<res<<endl; 52 if (res<=t) //39/6<=6 53 summ+=1; 54 } 55 } 56 printf("%d ",summ); 57 58 return 0; 59 }