返回目录

题目描述

绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。

  1. 尝试沿着横线坐标正向绘制直线直到给定的终点E
  2. 期间可以通过指令在纵坐标轴方向进行偏移,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之内。

示例:

输入2 4
0 1
2 -2
输出4
说明

Python算法源码

# 第一行输入解析
n, end_x = map(int, input().split())
 
# 记录题解
ans = 0
 
last_x = 0  # 上一个点的横坐标
last_y = 0  # 上一个点的纵坐标
 
# 获取n行输入
for _ in range(n):
    # 当前点的横坐标, 当前点纵坐标相较于上一个点纵坐标的偏移量
    cur_x, offset_y = map(int, input().split())
 
    # cur_x - last_x 结果是上一个点到当前点的横向距离, 这个距离过程中,高度保持为abs(last_y)
    ans += (cur_x - last_x) * abs(last_y)
 
    # 更新last_x, last_y
    last_x = cur_x
    last_y += offset_y
 
# 注意结束位置的处理
if end_x > last_x:
    ans += (end_x - last_x) * abs(last_y)
 
print(ans)

C算法源码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 获取输入
    int n, end_x;
    scanf("%d %d", &n, &end_x);

    // 记录题解
    long long ans = 0;
    // 上一个点的横坐标
    long long last_x = 0;
    // 上一个点的纵坐标
    long long last_y = 0;

    // 获取n行输入
    for (int i = 0; i < n; i++) {
        int cur_x, offset_y;
        scanf("%d %d", &cur_x, &offset_y);

        // cur_x - last_x 结果是上一个点到当前点的横向距离, 这个距离过程中,高度保持为abs(last_y)
        ans += (cur_x - last_x) * labs(last_y);

        // 更新last_x, last_y
        last_x = cur_x;
        last_y += offset_y;
    }

    // 注意结束位置的处理
    if (end_x > last_x) {
        ans += (end_x - last_x) * labs(last_y);
    }

    // 输出结果
    printf("%lld\n", ans);

    return 0;
}

Java算法源码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 获取输入
        int n = sc.nextInt(); // 点的数量
        int e = sc.nextInt(); // 结束位置

        // 如果结束位置为0,直接输出0并结束程序
        if (e == 0) {
            System.out.println(0);
            return;
        }

        // 储存每个位置的纵坐标偏移量
        int[] offsets = new int[e];

        // 获取n行输入,记录每个位置的纵坐标偏移量
        for (int i = 0; i < n; i++) {
            int cur_x = sc.nextInt();
            int offset_y = sc.nextInt();
            offsets[cur_x] = offset_y;
        }

        // 计算每个位置的纵坐标
        int[] dp = new int[e];
        dp[0] = offsets[0];
        for (int i = 1; i < e; i++) {
            dp[i] = offsets[i] + dp[i - 1];
        }

        // 计算绝对值的和作为答案
        int ans = 0;
        for (int num : dp) {
            ans += Math.abs(num);
        }
        // 输出答案
        System.out.println(ans);
    }
}
最后修改:2024 年 04 月 03 日
如果觉得我的文章对你有用,请随意赞赏