• [蓝桥杯 2022 省 B] 统计子矩阵


    题目描述

    给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小 1×1, 最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K。

    输入格式

    第一行包含三个整数 N, M和 K。

    之后 N 行每行包含 M 个整数, 代表矩阵 A。

    输出格式

    一个整数代表答案。

    输入输出样例

    输入 #1

    3 4 10
    1 2 3 4
    5 6 7 8
    9 10 11 12

    输出 #1

    19

    说明/提示

    【样例说明】

    满足条件的子矩阵一共有 19,包含:

    大小为 1×1 的有 10个。

    大小为1×2 的有 3 个。 大小为1×3 的有 2 个。

    大小为 1×4 的有 1 个。

    大小为 2×1 的有 3 个。

    【评测用例规模与约定】

    对于30% 的数据, N,M≤20.

    对于 70% 的数据, N,M≤100.

    对于 100% 的数据, 1≤N,M≤500,0≤Aij​≤1000,1≤K≤2.5×10^8.

    蓝桥杯 2022 省赛 B 组 F 题。

    80代码 O(n^4)

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=1e5+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int qsm(int x,int n)
    11. {
    12. int res=1;
    13. while(n)
    14. {
    15. if(n&1)res=res*x%mod;
    16. x=x*x%mod;
    17. n>>=1;
    18. }
    19. return res;
    20. }
    21. int n,m,k;
    22. int a[510][510];
    23. int sum[510][510];
    24. signed main()
    25. {
    26. cin>>n>>m>>k;
    27. fp(i,1,n)
    28. {
    29. fp(j,1,m)
    30. {
    31. cin>>a[i][j];
    32. sum[i][j]=sum[i][j-1]+sum[i-1][j]+a[i][j]-sum[i-1][j-1];
    33. }
    34. }
    35. int cnt=0;
    36. for(int i=1;i<=n;i++)
    37. {
    38. for(int j=1;j<=m;j++)
    39. {
    40. for(int t=i;t<=n;t++)
    41. {
    42. for(int f=j;f<=m;f++)
    43. {
    44. int x=sum[t][f]-sum[i-1][f]-sum[t][j-1]+sum[i-1][j-1];
    45. if(x<=k)cnt++;
    46. }
    47. }
    48. }
    49. }
    50. cout<<cnt<<"\n";
    51. return 0;
    52. }

     100代码O(n^3)

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=1e5+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int qsm(int x,int n)
    11. {
    12. int res=1;
    13. while(n)
    14. {
    15. if(n&1)res=res*x%mod;
    16. x=x*x%mod;
    17. n>>=1;
    18. }
    19. return res;
    20. }
    21. int n,m,k;
    22. int a[510][510];
    23. int sum[510][510];
    24. signed main()
    25. {
    26. cin>>n>>m>>k;
    27. fp(i,1,n)
    28. {
    29. fp(j,1,m)
    30. {
    31. cin>>a[i][j];
    32. sum[i][j]=sum[i-1][j]+a[i][j];
    33. }
    34. }
    35. int cnt=0;
    36. for(int i=1;i<=n;i++)
    37. {
    38. for(int j=i;j<=n;j++)
    39. {
    40. int s=0;
    41. for(int l=1,r=1;r<=m;r++)
    42. {
    43. s+=sum[j][r]-sum[i-1][r];
    44. while(s>k)
    45. {
    46. s-=sum[j][l]-sum[i-1][l];
    47. l++;
    48. }
    49. cnt+=r-l+1;
    50. }
    51. }
    52. }
    53. cout<<cnt<<"\n";
    54. return 0;
    55. }

  • 相关阅读:
    51单片机送餐机器人快递机器人_ESP8266_APP_WIFI(原理图+PCB+源码)
    nodejs下载慢问题
    Go语言学习(七)-- 方法和接口
    为什么越来越多的开发者放弃使用Postman,而选择Eolink?
    how to alert when etl inbound file delay in GCP storage
    C自定义函数
    【算法】顺序查找解析
    深入理解Java内存模型JMM与volatile关键字
    SQL查询比较慢,如何进行排查?如何进行SQL优化?
    上海市青少年算法2023年8月月赛(丙组)
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/133825999