【模拟】I Liked Matrix!
发布日期:2021-05-07 22:49:12 浏览次数:22 分类:精选文章

本文共 1387 字,大约阅读时间需要 4 分钟。

问题描述

给定一个 n × m 的矩阵 A,我们需要对其进行 q 次询问。每一次询问给出一个矩形区域,要求找出该区域内所有元素的最大值。

输入说明

  • 输入数据格式

    • 第一行包含三个整数 nmq
    • 接下来的 n 行每行包含 m 个整数,表示矩阵 A 的元素。
    • 接下来的 q 行每行包含四个整数 x1y1x2y2,表示查询的矩形区域。
  • 输入范围

    • nm 的值较小,适合直接模拟计算。
    • 每个元素的值范围也较小,不会超出常规整数范围。
  • 方法思路

    由于矩阵的数据量较小,我们可以直接对每个查询进行逐元素扫描,找出最大值。具体步骤如下:

  • 读取输入数据

    • 读取矩阵 A 的尺寸 nm
    • 读取矩阵的每个元素,存储在二维数组 a 中。
    • 读取每个查询请求,记录查询的矩形区域。
  • 处理每个查询

    • 对于每个查询,遍历指定的矩形区域内的所有元素,记录当前最大值。
    • 输出当前最大值作为查询结果。
  • 代码实现

    #include 
    #include
    using namespace std;
    int main() {
    // 读取输入
    int n, m, q;
    scanf("%d %d %d", &n, &m, &q);
    // 初始化矩阵
    int a[n+1][m+1]; // 1-based indexing
    for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
    scanf("%d", &a[i][j]);
    }
    }
    // 处理查询
    for (int k = 1; k <= q; ++k) {
    int x1, y1, x2, y2;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    int max_val = -1000000;
    // 遍历子矩阵区域
    for (int i = x1; i <= x2; ++i) {
    for (int j = y1; j <= y2; ++j) {
    if (a[i][j] > max_val) {
    max_val = a[i][j];
    }
    }
    }
    // 输出结果
    printf("%d\n", max_val);
    }
    return 0;
    }

    代码解释

  • 读取输入

    • 读取矩阵尺寸 nm 和查询次数 q
    • 使用 for 循环读取矩阵元素,存储在二维数组 a 中。
    • 使用 scanf 函数读取查询请求。
  • 处理查询

    • 对于每个查询,初始化当前最大值为一个非常小的值。
    • 使用双重 for 循环遍历指定的矩形区域,更新当前最大值。
    • 输出当前最大值作为查询结果。
  • 这种方法直接采用逐元素扫描的方式,虽然简单,但由于数据量较小,效率足够。

    上一篇:【模拟】I Like Matrix!
    下一篇:【模拟】I Got a Matrix!

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年03月21日 19时33分05秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章