题目描述:
绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线:
1)尝试沿着横向坐标轴正向绘制直线,直到给定的终点值 E。
2)期间可通过指令在纵坐标轴方向进行偏移,并同时绘制直线,偏移后按规则 1 绘制直线;
指令的格式为 X offsetY,表示在横坐标 X 沿纵坐标方向偏移,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 内
示例1:
输入
4 10
1 1
2 1
3 1
4 -2
输出
12
示例2:
输入
2 4
0 1
2 -2
输出
4
C++源码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, E;
cin >> N >> E;
vector<pair<int, int>> lines;
for (int i = 0; i < N; ++i) {
int x, yOffset0;
cin >> x >> yOffset0;
lines.push_back(make_pair(x, yOffset0));
}
int area = 0;
int last_x = lines[0].first;
int last_y = lines[0].second;
for (int i = 1; i < N; ++i) {
int x = lines[i].first;
int yOffset1 = lines[i].second + last_y;
int length;
if (last_y == 0) {
length = 0;
}
else if (yOffset1 * last_y > 0) {
length = abs(last_y);
}
else {
length = abs(last_y); // 这里逻辑似乎重复,但在转换时保持原样
}
int width = x - last_x;
area += length * width;
last_x = x;
last_y = yOffset1;
}
int final_length = abs(last_y);
int final_width = E - last_x;
area += final_length * final_width;
cout << area << endl;
system("pause");
return 0;
}