_Drizzle 2025-03-04 01:18 采纳率: 100%
浏览 4
已结题

(标签-蓝桥杯|关键词-stream)

蓝桥杯2109统计子矩阵我的通过率只有70%(哭哭

img

img

img


```c++
#include <iostream>
using namespace std;
int arr[501][501];
int k, n, m;
int sum[501][501] = { 0 };
long long num=0;
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for (int x = 1; x <= n; x++) {
        for (int y = 1; y <= m; y++) {
            scanf("%d", &arr[x][y]);
            sum[x][y] = sum[x - 1][y] + sum[x][y - 1] - sum[x - 1][y - 1] + arr[x][y];
        }
    }
    for (int x1 = 1; x1 <= n; x1++) {
        for (int x2 = x1; x2 <= n; x2++) {
            int y1 = 1;
            int y2 = 1;
            for (; y1 <= m; y1++) {
                while (y2<=m&&(sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1])<= k) {
                    y2++;

                }
                
                num += (y2 - y1);
                
            }
        }
    }
    printf("%d", num);
    return 0;
}
  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-03-04 01:23
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    这道题目是统计子矩阵中满足和小于等于k的子矩阵个数。你的代码逻辑是正确的,但是在累加num的时候用的是+=,应该改成+=。另外,可能是因为数据量较大导致运行时间较长,可以考虑优化算法。 这里给出一个代码示例:
    #include <iostream>
    using namespace std;
    int arr[501][501];
    int k, n, m;
    int sum[501][501] = { 0 };
    long long num = 0;
    int main() {
        scanf("%d%d%d", &n, &m, &k);
        
        for (int x = 1; x <= n; x++) {
            for (int y = 1; y <= m; y++) {
                scanf("%d", &arr[x][y]);
                sum[x][y] = sum[x - 1][y] + sum[x][y - 1] - sum[x - 1][y - 1] + arr[x][y];
            }
        }
        
        for (int x1 = 1; x1 <= n; x1++) {
            for (int x2 = x1; x2 <= n; x2++) {
                int y1 = 1;
                int y2 = 1;
                for (; y1 <= m; y1++) {
                    while (y2 <= m && (sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1]) <= k) {
                        y2++;
                    }
                    num += (y2 - y1);
                }
            }
        }
        
        printf("%lld", num);
        
        return 0;
    }
    

    希望对你有帮助。如果还有问题,请继续问哦。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月4日
  • 已采纳回答 3月4日
  • 创建了问题 3月4日