领域均值

CCF202104-2-Python题解_前缀和

CCF202104-2-Python题解_前缀和_02

4 16 1 6
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

CCF202104-2-Python题解_像素点_03

7

CCF202104-2-Python题解_像素点_04

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

CCF202104-2-Python题解_python3_05

83

 CCF202104-2-Python题解_像素点_06

 

题解:最普通的思路,根据每一个(i,j), 按照给定的r, for for 循环暴力,不好意思,会超时,如下所示,这里要更正一下,实际超时这个代码,在当时考试的时候,只拿了30分,所以之前博客说的,模拟时间更长是错的

CCF202104-2-Python题解_CCF考试题;_07

 

 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)