华为机考真题 -- 计算面积

题目描述:

绘图机器的绘图笔初始位置在原点(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值