通过率 53% · 提交 437 · 通过 233
小慕正在开发一款绘图工具,绘图笔的起始位置在原点 (0, 0)。工具启动后,绘图笔按照以下规则绘制直线: 1. 尝试沿着横向坐标轴的正方向绘制直线,直到给定的终点值 E。 2. 在绘制过程中,可以通过指令在纵坐标轴方向进行,同时继续绘制直线。偏移后,仍然按照规则 1 继续绘制直线。 指令的格式为 X offsetY,表示在横坐标 X 处沿纵坐标方向偏移,offsetY 为正数表示正向偏移,为负数表示负向偏移。 现在,小慕得到了横坐标终点值 E 以及若干条绘制指令,请你帮忙计算绘制的直线与横坐标轴以及直线 X = E 所围成的图形的面积。
这类题属于华为 OD 机考真题方向中「100分 / 数学」方向的高频题型,通常考察对「100分 / 数学」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
首行为两个整数 N E,表示有N条指令,机器运行的横坐标终点值E。
接下来N行,每行两个整数表示一条绘制指令X offsetY,用例保证横坐标X以递增排序方式出现,且不会出现相同横坐标X。
取值范围:0 < N <= 10000, 0 <= X <= E <= 20000, -10000 <= offsetY <= 10000。
一个整数,表示计算得到的面积,用例保证,结果范围在0~4294967295内
示例 1
输入示例
4 10 1 1 2 1 3 1 4 -2
输出示例
12
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
题目很难读,建议根据例子反推含义。 主要是对 绘制指令 `X offsetY` 的理解。
绘制指令 `X offsetY` 表示:在 x 轴的 X 位置,向 y 轴偏移 offsetY。 (注意:单词 offset 表示“偏移”的意思,所以绘制指令 X offsetY 表示一个 动作,而不是一个具体的坐标)
示例对应的图如下:
可以看出,线段和 x 轴围成的面积是: 1*1 + 1*2 + 1*3 + 6*1 = 12
理解了题意之后,问题就比较简单了。
我们初始化当前点为原点 (cur_x, cur_y) = (0, 0),且初始面积 area = 0。
如图所示,如果我们知道图中标注出来的点的坐标,就可以计算出所有的面积。
如果已知当前点的坐标 (cur_x, cur_y) 和指令 X offsetY,那么下一个点的坐标可以很方便地通过以下式子计算得到: (nxt_x, nxt_y) = (X, cur_y + offsetY) 而围成的面积的增量是: (nxt_x - cur_x) * cur_y
特别地,如果出现了直线位于 x 轴下方,那么面积需要取绝对值,即: abs((nxt_x - cur_x) * cur_y)
故单次更新面积的代码为:
复杂度分析 设 n 为绘制指令的条数。程序先用一个 for 循环读入 n 条指令存进 lst,这是 O(n);再把终点 (E, -1) 追加到 lst 末尾,使最后一段水平线也能参与面积计算,追加是 O(1)。核心是那个遍历 n+1 个元素的 for 循环:每轮只做「算出下一个点坐标 (X, cur_y + offsetY)、把一块矩形面积 abs((nxt_x - cur_x) * cur_y) 累加进 area、更新当前点」三步常数操作,代码按输入顺序依次处理指令,没有嵌套循环,也不做排序,所以这一段是 O(n)。总时间复杂度为 O(n),瓶颈就是这趟对指令列表的线性扫描。空间上,lst 完整存储了 n+1 条指令,空间复杂度为 O(n),此外只用了 area、cur_x、cur_y 等常数个变量。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有