题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
绘图机器的绘图笔初始位置在原点(0,0)
机器启动后按照以下规则来进行绘制直线
- 尝试沿着横线坐标正向绘制直线
直到给定的终点E
- 期间可以通过指令在纵坐标轴方向进行偏移
offsetY
为正数表示正向偏移,为负数表示负向偏移
给定的横坐标终点值E
以及若干条绘制指令
请计算绘制的直线和横坐标轴以及x = E
的直线组成的图形面积
输入
首行为两个整数N
和 E
表示有N
条指令,机器运行的横坐标终点值E
接下来N
行 每行两个整数表示一条绘制指令x offsetY
用例保证横坐标x
以递增排序的方式出现
且不会出现相同横坐标x
取值范围:
0 < N <= 10000
0 <= x <= E <= 20000
-10000 <= offsetY <= 10000
输出
一个整数表示计算得到的面积 用例保证结果范围在0
到4294967295
之内
示例一
输入
4 10
1 1
2 1
3 1
4 -2
输出
12
示例二
输入
2 4
0 1
2 -2
输出
4
代码
#include <stdio.h>
#include <stdlib.h>
typedef struct {int x;int offsetY;
} Pos;int main() {int N, E;scanf("%d %d", &N, &E);Pos pos[N + 1];for (int i = 0; i < N; i++) {scanf("%d %d", &pos[i].x, &pos[i].offsetY);}int currentY = 0;int sumArea = 0;// 添加终点作为最后一条指令pos[N].x = E;pos[N].offsetY = 0;for (int i = 0; i < N; i++) {int base = pos[i + 1].x - pos[i].x;int height = currentY + pos[i].offsetY;sumArea += base * abs(height);currentY += pos[i].offsetY; // 更新当前纵坐标偏移}printf("%d", sumArea);return 0;
}