题目

暂无

思路

一开始用四重循环,30%的数据会超时。后来我用类似前缀和的思路改进成三重循环,O(n³)通过。

代码

我的考场上的满分代码

  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4. const int N =600+5;
  5. int matrix[N][N];
  6. int qianzhui[N][N];
  7. int sum[N][N];
  8. int main(){
  9. memset(qianzhui,0,sizeof(qianzhui);
  10. memset(sum,0,sizeof(sum);
  11. int n,r,L,t;
  12. cin>>n>>r>>L>>t;
  13. for(int i=0;i<n;i++){
  14. for(int j=0;j<n;j++){
  15. cin>>matrix[i][j];
  16. }
  17. }
  18. for(int i=0;i<n;i++){
  19. qianzhui[i][0] =matrix[i][0];
  20. }
  21. for(int i=0;i<n;i++){
  22. for(int j=1;j<n;j++){
  23. qianzhui[i][j]+=qianzhui[i][j-1]+matrix[i][j];
  24. }
  25. }
  26. for(int i=0;i<n;i++){
  27. int s =i-r>=0?i-r:0;
  28. int e =i+r<n?i+r:n-1;
  29. for(int j=0;j<n;j++){
  30. int s1=j-r>=0?j-r:0;
  31. int e1=j+r<n?j+r:n-1;
  32. for(int a =s1;a<e1;a++){
  33. if(s-1<0){
  34. sum[i][j]+=qianzhui[a][e];
  35. }else{
  36. sum[i][j]+=qianzhui[a][e]-qianzhui[a][s-1];
  37. }
  38. }
  39. sum[i][j]/=(e1-s1+1)*(e-s+1);
  40. }
  41. }
  42. int count=0;
  43. for(int i=0;i<n;i++){
  44. for(int j=0;j<n;j++){
  45. if(sum[i][j]<=t){
  46. count++;
  47. }
  48. }
  49. }
  50. cout<<count;
  51. return 0;
  52. }