CCF202104-2-Python and C++题解

原题链接: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 }
View Code
原文地址:https://www.cnblogs.com/z-712/p/15047887.html