编程入门者咨询:行/列求和矩阵编程题的理解与求解
题意详解
这道题的核心是先搞懂数字排布规则,再明确行、列的定义:
- 我们需要把数字
1到N按顺序填入网格,规则是除最后一行外,每行固定填W个数字,填完一行就换行。 - 如果数字不够填满最后一行,最后一行仅保留剩余数字,空位不补内容。
- 行、列均为1-based计数:
- 行(对应输入的
R):横向的一排,最上方为第1行,向下依次递增。 - 列(对应输入的
C):纵向的一列,所有行的第一个数字组成第1列,所有行的第二个数字组成第2列,以此类推。
- 行(对应输入的
用样例直观理解排布
第一个测试用例:N=5, W=2
排布后的网格如下:
第1行:
12
第2行:34
第3行:5(空位)
对应列的组成:
第1列:1、3、5
第2列:2、4(最后一行无第二个数,因此列仅到第二行)
查询为2 C即求第2列的和,计算得2+4=6,和样例输出一致。
第二个测试用例:N=10, W=3
排布后的网格如下:
第1行:
123
第2行:456
第3行:789
第4行:10(空位、空位)
查询为4 R即求第4行的和,仅包含10,和样例输出一致。
计算逻辑(无需构建矩阵)
不需要真的创建二维数组存储所有数字,直接用等差数列公式计算即可,避免不必要的内存开销。
行求和(op=R)
- 第X行的第一个数字为:
(X-1)*W + 1 - 该行的数字个数:若为非最后一行则有
W个;若为最后一行则有N - (X-1)*W个 - 该行的数字是连续等差数列,和为:
(首项 + 末项) * 个数 // 2
列求和(op=C)
- 仅当
X <= W时存在第X列(每行最多W个数字,列数不会超过W) - 第X列的所有数字是公差为
W的等差数列:首项为X,后续每一项比前一项大W - 列的项数为:
(N - X) // W + 1,末项为:(项数 - 1)*W + X - 列的和为:
(首项 + 末项) * 项数 // 2
示例代码(Python)
T = int(input()) for _ in range(T): N, W = map(int, input().split()) parts = input().split() X = int(parts[0]) op = parts[1] if op == 'R': first = (X - 1) * W + 1 if first > N: print(0) continue count = min(W, N - first + 1) last = first + count - 1 res = (first + last) * count // 2 print(res) else: if X > W: print(0) continue m = (N - X) // W + 1 first = X last = (m - 1) * W + X res = (first + last) * m // 2 print(res)
内容的提问来源于stack exchange,提问作者Devender Kaka
相关产品推荐
相关产品推荐

