• 蓝桥杯每日一题2023.9.18


    蓝桥杯2022年第十三届省赛真题-统计子矩阵 - C语言网 (dotcpp.com)

    题目描述

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

    分析

    如果不考虑范围问题等,可以用二位前缀和,一步一步列举

    1. #include
    2. using namespace std;
    3. const int N = 1e4 + 10;
    4. int n, m, k, ans, a[N][N], s[N][N];
    5. int main()
    6. {
    7. cin >> n >> m >> k;
    8. for(int i = 1; i <= n; i ++)
    9. {
    10. for(int j = 1; j <= m; j ++)
    11. {
    12. cin >> a[i][j];
    13. }
    14. }
    15. for(int i = 1; i <= n; i ++)
    16. {
    17. for(int j = 1; j <= m; j ++)
    18. {
    19. s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
    20. }
    21. }
    22. ans = 0;
    23. for(int x1 = 1; x1 <= n; x1 ++)
    24. {
    25. for(int y1 = 1; y1 <= m; y1 ++)
    26. {
    27. for(int x2 = x1; x2 <= n; x2 ++)
    28. {
    29. for(int y2 = y1; y2 <= m; y2 ++)
    30. {
    31. if (s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] <= k)ans ++;
    32. }
    33. }
    34. }
    35. }
    36. cout << ans;
    37. return 0;
    38. }

    但是四重循环会使时间超限

    故可以考虑优化

    将上下边界进行循环,使用双指针来列出左右边界,由于范围一定 <= k,故超过这个的话就移动指针

    将上下枚举出来就可以看成一个一维问题,可以将每一列看成一个元素,相当于一个一维数组,在这个数组里找到哪些区间  <= k

    1. #include
    2. using namespace std;
    3. const int N = 1e4 + 10;
    4. int n, m, k, sum, ans, a[N][N], s[N][N];
    5. int main()
    6. {
    7. cin >> n >> m >> k;
    8. for(int i = 1; i <= n; i ++)
    9. {
    10. for(int j = 1; j <= m; j ++)
    11. {
    12. cin >> a[i][j];
    13. }
    14. }
    15. for(int i = 1; i <= n; i ++)
    16. {
    17. for(int j = 1; j <= m; j ++)
    18. {
    19. s[i][j] = s[i - 1][j] + a[i][j];//算出这一列的前缀和
    20. }
    21. }
    22. for(int i = 1; i <= n; i ++)//枚举上边界
    23. {
    24. for(int j = i; j <= n; j ++)//枚举下边界
    25. {
    26. for(int l = 1, r = 1, sum = 0; r <= m; r ++)//枚举左右边界
    27. {
    28. sum += s[j][r] - s[i - 1][r];
    29. while(sum > k)
    30. {
    31. sum -= s[j][l] - s[i - 1][l];
    32. l ++;
    33. }
    34. ans += r - l + 1;
    35. }
    36. }
    37. }
    38. cout << ans;
    39. return 0;
    40. }
  • 相关阅读:
    从原理到实战,详解XXE攻击
    【pulsar学习】pulsar架构原理
    分页查询与集合查询
    Vue3学习
    Redis快速度特性及为什么支持多线程及应用场景
    SW-2运行结果
    2022/11/28-29总结
    小程序uView2.X框架upload组件上传方法总结+避坑
    数据结构--时间复杂度和空间复杂
    使用Spring Integration接收TCP与UDP请求
  • 原文地址:https://blog.csdn.net/m0_75087931/article/details/132992879