以下为100分代码,仅供参考。
题目链接
C++代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,L,r,t;
int sum=0;
int ans=0;
cin>>n>>L>>r>>t;
int s[n+5][n+5];
int fronts[n+5][n+5];
for(int i=0;i<n;i++)
{
memset(s[i],0,sizeof s[i]);
memset(fronts[i],0,sizeof fronts[i]);
}
for( int i=0; i<n; i++ )
{
for( int j=0; j<n; j++ )
{
cin>>s[i][j];
if( i==0 && j!=0 ) fronts[0][j]= fronts[0][j-1] + s[i][j];
if( j==0 && i!=0 ) fronts[i][0]= fronts[i-1][0] + s[i][j];
fronts[0][0] = s[0][0]; //60 points的原因
}
}
for( int i=1; i<n; i++ )
{
for( int j=1; j<n; j++ )
{
fronts[i][j] = fronts[i-1][j] + fronts[i][j-1] - fronts[i-1][j-1] + s[i][j];
}
}
int x=0;
int y=0;
int all;
for( int i=0; i<n; i++ )
{
for( int j=0; j<n; j++ )
{
x = min(r,i) + 1 + min(n-1-i,r);
y = min(r,j) + 1 + min(n-1-j,r);
sum = x*y;
//无减前缀和的情况
if(i<=r&&j<=r) all=fronts[min(i+r,n-1)][min(j+r,n-1)];
//减上方前缀和情况
else if(i<=r) all=fronts[min(i+r,n-1)][min(j+r,n-1)]-fronts[min(i+r,n-1)][j-r-1];
//减左方前缀和情况
else if(j<=r) all=fronts[min(i+r,n-1)][min(j+r,n-1)]-fronts[i-r-1][min(j+r,n-1)];
//减上方及左方的前缀和情况
else all=fronts[min(i+r,n-1)][min(j+r,n-1)]-fronts[i-r-1][min(j+r,n-1)]-fronts[min(i+r,n-1)][j-r-1]+fronts[i-r-1][j-r-1];
if( all<=t*sum )
ans++;
}
}
cout<<ans;
return 0;
}