• 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
  • 相关阅读:
    hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
    hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
    山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)
    poj 2336 Ferry Loading II ( 【贪心】 )
    HDU 2037 今年暑假不AC ( 起始与终止时间 【贪心】)
    hdu 2015校赛1002 Dual horsetail (思维题 )
    poj 3041 Asteroids(二分图 *【矩阵实现】【最小点覆盖==最大匹配数】)
    poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )
    【P1326】超级教主
    Tyvj 9.10 总结 (其实只是发一下心情)
  • 原文地址:https://www.cnblogs.com/z-712/p/15047887.html
Copyright © 2020-2023  润新知