
【模拟】I Liked Matrix!
发布日期:2021-05-07 22:49:12
浏览次数:22
分类:精选文章
本文共 1387 字,大约阅读时间需要 4 分钟。
问题描述
给定一个 n × m
的矩阵 A
,我们需要对其进行 q
次询问。每一次询问给出一个矩形区域,要求找出该区域内所有元素的最大值。
输入说明
输入数据格式:
- 第一行包含三个整数
n
、m
和q
。 - 接下来的
n
行每行包含m
个整数,表示矩阵A
的元素。 - 接下来的
q
行每行包含四个整数x1
、y1
、x2
和y2
,表示查询的矩形区域。
输入范围:
n
和m
的值较小,适合直接模拟计算。- 每个元素的值范围也较小,不会超出常规整数范围。
方法思路
由于矩阵的数据量较小,我们可以直接对每个查询进行逐元素扫描,找出最大值。具体步骤如下:
读取输入数据:
- 读取矩阵
A
的尺寸n
和m
。 - 读取矩阵的每个元素,存储在二维数组
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;}
代码解释
读取输入:
- 读取矩阵尺寸
n
、m
和查询次数q
。 - 使用
for
循环读取矩阵元素,存储在二维数组a
中。 - 使用
scanf
函数读取查询请求。
处理查询:
- 对于每个查询,初始化当前最大值为一个非常小的值。
- 使用双重
for
循环遍历指定的矩形区域,更新当前最大值。 - 输出当前最大值作为查询结果。
这种方法直接采用逐元素扫描的方式,虽然简单,但由于数据量较小,效率足够。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月21日 19时33分05秒
关于作者

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