题目
思路
一开始用四重循环,30%的数据会超时。后来我用类似前缀和的思路改进成三重循环,O(n³)通过。
代码
我的考场上的满分代码
#include<iostream>
#include<string.h>
using namespace std;
const int N =600+5;
int matrix[N][N];
int qianzhui[N][N];
int sum[N][N];
int main(){
memset(qianzhui,0,sizeof(qianzhui);
memset(sum,0,sizeof(sum);
int n,r,L,t;
cin>>n>>r>>L>>t;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>matrix[i][j];
}
}
for(int i=0;i<n;i++){
qianzhui[i][0] =matrix[i][0];
}
for(int i=0;i<n;i++){
for(int j=1;j<n;j++){
qianzhui[i][j]+=qianzhui[i][j-1]+matrix[i][j];
}
}
for(int i=0;i<n;i++){
int s =i-r>=0?i-r:0;
int e =i+r<n?i+r:n-1;
for(int j=0;j<n;j++){
int s1=j-r>=0?j-r:0;
int e1=j+r<n?j+r:n-1;
for(int a =s1;a<e1;a++){
if(s-1<0){
sum[i][j]+=qianzhui[a][e];
}else{
sum[i][j]+=qianzhui[a][e]-qianzhui[a][s-1];
}
}
sum[i][j]/=(e1-s1+1)*(e-s+1);
}
}
int count=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(sum[i][j]<=t){
count++;
}
}
}
cout<<count;
return 0;
}