[计算面积]
绘图机器的绘图笔初始位i在原点(0.0)。 机器启动后其绘图笔按下面规则绘制直线:
1 )尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E,
2 )期间可通过指令在纵坐标轴方向进行偏移。井同时恰制直线,偏移后按规则1绘制直线;指令的格式为X offsetY。表示在横坐标X沿纵坐标方向偏移, offsetY为正数表示正向偏移,为负数表示负向偏移。
给定了横坐标格点值E.以及若干条检制指令。请计算给制的直线和横坐标轴。以及X-E的直线组成图形的面积。
输入模述:
首行为两个整数NE。表示有N条指令。机器运行的横坐标終点值E.
接下来N行。每行两个整数表示-条给制指令x osorr。用例保证横坐标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
示例3
4 10
1 1
2 -1
3 -1
4 1
输出:
2
示例4
1 10
0 0
0
示例5
1 10
0 1
10
示例6
1 10
0 20
200
题意理解:
// 题意理解:
// 因为是沿着横坐标正向绘制直线,其实就是求解绘制线段轨迹投影到X轴上时覆盖的面积,
// 其中终点不一定在X轴上,只要终点的横坐标与终点值E相等就行
// 轨迹可以在X轴上方,也可以在X轴下方,即Y的值可正可负,计算面积时需要使用绝对值

方法1:暴力枚举
/area_calc_00_vio_00.cc
// 题意理解:
// 因为是沿着横坐标正向绘制直线,其实就是求解绘制线段轨迹投影到X轴上时覆盖的面积,
// 其中终点不一定在X轴上,只要终点的横坐标与终点值E相等就行
// 轨迹可以在X轴上方,也可以在X轴下方,即Y的值可正可负,计算面积时需要使用绝对值
// 算法: 暴力枚举
#include <bits/stdc++.h>
using namespace std;
int GetRes(int N, int E, vector<pair<int, int>> & cmds)
{
int res = 0;
// 因为第1条指令不会产生覆盖面积,不管是在X轴上还是在Y上
// 后一条指令与前一条指令产生的面积是根据前一条指令结束后的Y与两条指令X差值计算得来
int curY = cmds[0].second;
for (int i = 1; i < cmds.size(); ++i) {
// 两个指令之间覆盖的X就是后一个指令的X-前一个指令的X
// 因为是沿X轴正向绘制且X坐标不重合,所以不需要考虑正负号
int lx = cmds[i].first – cmds[i – 1] .first;
// 对应的Y其实就是前一个指令结束后的Y,指的是当前指令与前一个指令之间的面积
// 因为当前指令只是起点,还没有形成覆盖面积
res += lx * abs(curY);
// 指令执行完成后需要对curY进行更新
curY += cmds[i].second;
}
// 最后一个坐标位置覆盖面积计算
res += (E – cmds.back().first) * abs(curY);
return res;
}
int main()
{
int N, E;
while (cin >> N >> E) {
vector<pair<int, int>> cmds(N, {0, 0});
for (int i = 0; i < N; ++i) {
cin >> cmds[i].first >> cmds[i].second;
}
cout << GetRes(N, E, cmds) << endl;
}
return 0;
}
方法2:暴力枚举
/area_calc_00_vio_00.cc
// 算法: 暴力枚举
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N, E;
while (cin >> N >> E) {
int res = 0;
int curX = 0;
int curY = 0;
for (int i = 0; i < N; ++i) {
int x, y;
cin >> x >> y;
int lx = x – curX;
// 没次输入指令需要与X轴计算面接并累加
res += lx * abs(curY);
curX = x;
curY += y;
}
// 需要加上最后一个指令到终点E的面积
res += (E – curX) * abs(curY);
cout << res << endl;
}
return 0;
}



