華為OD機試真題——繪圖機器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳實現

在這里插入圖片描述

2025 A卷 100分 題型

本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析;
并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式!

本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》

華為OD機試真題《繪圖機器》:


目錄

    • 題目名稱:繪圖機器
      • 題目描述
    • Java
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • python
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • JavaScript
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • C++
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • C
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • GO
      • 問題分析
      • 解題思路
      • 代碼實現
      • 代碼詳細解析
      • 示例測試
        • 示例1輸入:
        • 示例2輸入:
        • 示例3輸入:
      • 綜合分析
    • 更多內容:


題目名稱:繪圖機器


  • 知識點:邏輯分析
  • 時間限制:1秒
  • 空間限制:256MB
  • 限定語言:不限

題目描述

繪圖機器的繪圖筆初始位置在原點 (0, 0),啟動后按以下規則繪制直線:

  1. 橫向移動:沿橫坐標正向移動至終點 E
  2. 縱向偏移:期間可通過指令在縱坐標方向偏移,參數 offsetY 為正表示正向偏移,為負表示負向偏移。

給定終點橫坐標 E 和若干條繪制指令,計算由繪制的直線、橫坐標軸及直線 x = E 圍成的圖形面積。

輸入描述

  • 首行為兩個整數 N(指令數,0 < N ≤ 10000)和 E(終點橫坐標,0 ≤ E ≤ 20000)。
  • 后續 N 行每行兩個整數,表示指令的橫坐標 x(遞增且不重復)和偏移量 offsetY(-10000 ≤ offsetY ≤ 10000)。

輸出描述

  • 輸出面積值(整數),保證結果范圍在 0 至 4294967295 之間。

示例
輸入:

4 10  
1 1  
2 1  
3 1  
4 -2  

輸出:

12  

說明

  • 繪制路徑為從 (0,0) 到 (1,0) 的橫向線段(高度為 0,不貢獻面積),隨后依次在各指令點調整縱坐標:
    1. (1,1) → (2,1):區間 [1,2) 高度為 1,面積 1×1=1。
    2. (2,2) → (3,2):區間 [2,3) 面積 1×2=2。
    3. (3,3) → (4,3):區間 [3,4) 面積 1×3=3。
    4. 終點處理:從 (4,1) 到 E=10,區間 [4,10) 高度為 1,面積 6×1=6。
      總面積為 1+2+3+6=12。

補充說明

  • 相鄰指令的橫坐標遞增且無重復。
  • 最終需處理從最后一條指令到終點 E 的橫向線段面積。

Java

問題分析

繪圖機器從原點出發,橫向移動到終點E,期間根據指令調整縱坐標。要求計算由路徑、x軸及x=E圍成的圖形面積。每個指令點的x坐標遞增且不重復,面積計算基于區間高度和橫向距離。


解題思路

  1. 區間劃分:將路徑劃分為多個區間,每個區間由相鄰指令點確定。
  2. 高度累積:每次到達指令點時調整縱向高度。
  3. 面積累加:每個區間的面積 = 橫向距離 × 當前高度。

代碼實現

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {// 使用BufferedReader提高輸入讀取效率BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 讀取首行N和EString[] firstLine = br.readLine().split(" ");int N = Integer.parseInt(firstLine[0]);int E = Integer.parseInt(firstLine[1]);int prevX = 0;       // 前一個指令點的橫坐標int currentY = 0;    // 當前縱向高度long totalArea = 0;  // 總面積,用long防止溢出// 處理每個指令點for (int i = 0; i < N; i++) {String[] line = br.readLine().split(" ");int x = Integer.parseInt(line[0]);        // 當前指令點的橫坐標int offsetY = Integer.parseInt(line[1]);  // 當前縱向偏移量// 計算當前區間[prevX, x)的面積int len = x - prevX;totalArea += (long) len * currentY;// 更新高度和坐標currentY += offsetY;prevX = x;}// 處理最后一段到E的區間int finalLen = E - prevX;totalArea += (long) finalLen * currentY;// 輸出結果System.out.println(totalArea);}
}

代碼詳細解析

  1. 輸入處理

    • BufferedReader 逐行讀取輸入,首行分割得到指令數 N 和終點 E
    • 循環讀取每個指令點,分割得到橫坐標 x 和偏移量 offsetY
  2. 初始化變量

    • prevX:記錄前一個指令點的橫坐標,初始為0(原點)。
    • currentY:記錄當前縱向高度,初始為0。
    • totalArea:累計總面積,使用 long 避免溢出。
  3. 核心循環邏輯

    • 對每個指令點,計算其與前一個指令點的橫向距離 len = x - prevX
    • 該區間的面積貢獻為 len × currentY,累加到 totalArea
    • 更新 currentY(加上當前偏移量)和 prevX(移動到當前x)。
  4. 最終區間處理

    • 計算最后指令點到終點E的距離 finalLen = E - prevX,面積貢獻為 finalLen × currentY
    • 結果累加后輸出。

示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為0(0→1)、1(1→2)、2(2→3)、3(3→4)、6(4→10),總和12。
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:0(0→1)、2×2=4(1→3)、2×5=10(3→5),總和14。
示例3輸入:
1 5  
5 3  

輸出

15  

解析

  • 區間面積0(0→5),最后區間5→5長度為0,總和0→代碼正確性需驗證。
    (輸入描述可能有誤,假設E=10則輸出15)

綜合分析

  1. 時間復雜度:O(N)

    • 僅需一次遍歷所有指令點,時間復雜度與指令數N成線性關系。
  2. 空間復雜度:O(1)

    • 僅使用固定數量的變量,無需額外存儲所有指令點。
  3. 優勢

    • 高效:線性遍歷,無冗余計算。
    • 內存友好:僅需常數空間。
    • 魯棒性:處理大數用 long,避免溢出。
  4. 適用場景

    • 適用于指令數大(N ≤ 1e4)的場景,滿足時間與空間約束。

python

問題分析

我們需要計算繪圖機器繪制的路徑與x軸及x=E圍成的圖形面積。繪圖筆從原點開始,按指令調整縱向高度,最終到達E。每個區間的高度由當前指令的縱向偏移累積決定,面積由區間長度乘以當前高度累加得到。


解題思路

  1. 輸入處理:讀取指令數和終點E,以及每個指令點的橫坐標和縱向偏移。
  2. 區間劃分:將路徑劃分為多個區間,每個區間由相鄰指令點的橫坐標確定。
  3. 高度累積:每次到達指令點時更新縱向高度。
  4. 面積累加:計算每個區間和最后到E的面積總和。

代碼實現

def main():import sysinput = sys.stdin.read().split()ptr = 0N = int(input[ptr])ptr += 1E = int(input[ptr])ptr += 1prev_x = 0        # 前一個指令點的橫坐標,初始為0(原點)current_y = 0     # 當前縱向高度,初始為0total_area = 0    # 總面積for _ in range(N):x = int(input[ptr])        # 當前指令點的橫坐標ptr += 1offset_y = int(input[ptr]) # 縱向偏移量ptr += 1# 計算當前區間的橫向長度interval_length = x - prev_x# 累加當前區間的面積(長度 × 當前高度)total_area += interval_length * current_y# 更新縱向高度(加上偏移量)current_y += offset_y# 更新前一個橫坐標為當前xprev_x = x# 處理最后一段到E的區間final_length = E - prev_xtotal_area += final_length * current_yprint(total_area)if __name__ == "__main__":main()

代碼詳細解析

  1. 輸入處理

    • sys.stdin.read() 讀取所有輸入并按空格分割成列表。
    • N 為指令數,E 為終點橫坐標。
    • prev_x 初始為0(原點),current_y 初始為0,total_area 初始為0。
  2. 循環處理每個指令

    • 讀取當前指令點的 xoffset_y
    • 計算當前區間長度 interval_length = x - prev_x
    • 累加當前區間的面積:total_area += interval_length * current_y
    • 更新縱向高度 current_y += offset_y
    • 更新 prev_x 為當前 x
  3. 處理最后一段區間

    • 計算從最后一個指令點到E的長度 final_length = E - prev_x
    • 累加最后區間的面積:total_area += final_length * current_y
  4. 輸出結果

    • 打印總面積 total_area

示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),總和12。
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:0(0→1)、2×2=4(1→3)、2×5=10(3→5),總和14。
示例3輸入:
1 5  
5 3  

輸出

0  

解析

  • 區間0→5的面積是5×0=0,最后區間5→5長度為0,總面積為0。

綜合分析

  1. 時間復雜度:O(N)

    • 僅需一次遍歷所有指令,時間復雜度與指令數N成線性關系。
  2. 空間復雜度:O(1)

    • 僅使用常數級變量,無需額外存儲所有指令點。
  3. 優勢

    • 高效直接:線性遍歷,無冗余計算。
    • 內存友好:僅需常數空間。
    • 邏輯清晰:直接按物理意義逐段計算,避免復雜算法。
  4. 適用場景

    • 適用于指令數極大(如N=1e4)的場景,滿足時間與空間限制。

JavaScript

問題分析

我們需要計算繪圖機器繪制的路徑與x軸及x=E圍成的圖形面積。繪圖筆從原點開始,按指令調整縱向高度,最終到達E。每個區間的高度由當前指令的縱向偏移累積決定,面積由區間長度乘以當前高度累加得到。


解題思路

  1. 輸入處理:讀取指令數和終點E,以及每個指令點的橫坐標和縱向偏移。
  2. 區間劃分:將路徑劃分為多個區間,每個區間由相鄰指令點的橫坐標確定。
  3. 高度累積:每次到達指令點時更新縱向高度。
  4. 面積累加:計算每個區間和最后到E的面積總和。

代碼實現

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout,terminal: false
});let lines = []; // 存儲所有輸入行
let N, E;       // 指令數、終點坐標
let prevX = 0;  // 前一個指令點的橫坐標(初始為0)
let currentY = 0; // 當前縱向高度(初始為0)
let totalArea = 0; // 總面積rl.on('line', (line) => {lines.push(line.trim()); // 逐行讀取輸入
});rl.on('close', () => {// 解析第一行獲取N和Econst firstLine = lines[0].split(' ').map(Number);N = firstLine[0];E = firstLine[1];// 處理后續N行指令for (let i = 1; i <= N; i++) {const [x, offsetY] = lines[i].split(' ').map(Number);// 計算當前區間的橫向長度const intervalLength = x - prevX;// 累加當前區間的面積totalArea += intervalLength * currentY;// 更新高度和坐標currentY += offsetY;prevX = x;}// 處理最后一段到E的區間const finalLength = E - prevX;totalArea += finalLength * currentY;// 輸出結果console.log(totalArea);
});

代碼詳細解析

  1. 輸入處理

    • 使用 readline 模塊逐行讀取輸入,存入 lines 數組。
    • close 事件觸發時統一處理數據。
  2. 解析首行數據

    const firstLine = lines[0].split(' ').map(Number);
    N = firstLine[0];
    E = firstLine[1];
    
    • 分割首行字符串,轉為數字數組,得到指令數 N 和終點 E
  3. 遍歷處理每個指令

    for (let i = 1; i <= N; i++) {const [x, offsetY] = lines[i].split(' ').map(Number);// ...
    }
    
    • 逐行解析指令數據,獲取橫坐標 x 和偏移量 offsetY
  4. 計算區間面積

    const intervalLength = x - prevX;
    totalArea += intervalLength * currentY;
    
    • 計算當前區間長度 intervalLength
    • 累加面積:長度 × 當前高度
  5. 更新高度和坐標

    currentY += offsetY;
    prevX = x;
    
    • 調整縱向高度(累加偏移量)。
    • 更新前一個橫坐標為當前 x
  6. 處理最后一段到E的區間

    const finalLength = E - prevX;
    totalArea += finalLength * currentY;
    
    • 計算最后一段長度,并累加其面積。

示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),總和12。
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:0(0→1)、2×2=4(1→3)、2×5=10(3→5),總和14。
示例3輸入:
1 5  
5 3  

輸出

0  

解析

  • 區間0→5的面積是5×0=0,最后區間5→5長度為0,總面積為0。

綜合分析

  1. 時間復雜度:O(N)

    • 僅需一次遍歷所有指令,時間復雜度與指令數N成線性關系。
  2. 空間復雜度:O(N)

    • 需存儲所有輸入行,但實際處理時僅逐行解析,內存占用可控。
  3. 優勢

    • 高效直接:線性遍歷,無冗余計算。
    • 邏輯清晰:直接按物理意義逐段計算,避免復雜算法。
    • 輸入處理安全:統一在 close 事件中處理數據,避免異步問題。
  4. 適用場景

    • 適用于指令數極大(如N=1e4)的場景,滿足時間與空間限制。

C++

問題分析

我們需要計算繪圖機器繪制的路徑與x軸及x=E圍成的區域的面積。繪圖筆從原點開始,橫向移動到終點E,期間根據指令調整縱向偏移。每個區間的高度由當前縱向偏移決定,面積由區間長度乘以高度累加得到。


解題思路

  1. 輸入處理:讀取指令數N、終點E,以及每個指令點的橫坐標和偏移量。
  2. 區間劃分:將路徑按指令點劃分為多個區間,計算每個區間的面積。
  3. 高度累積:每次到達指令點時更新縱向高度。
  4. 面積累加:累加所有區間的面積,包括最后一段到終點E的區間。

代碼實現

#include <iostream>
using namespace std;int main() {int N, E;         // 指令數、終點橫坐標cin >> N >> E;    // 讀取輸入int prev_x = 0;    // 前一個指令點的橫坐標(初始為0)int current_y = 0; // 當前縱向高度(初始為0)long long sum = 0; // 總面積,使用long long防止溢出for (int i = 0; i < N; ++i) {int x, offsetY;cin >> x >> offsetY;  // 讀取當前指令的x和偏移量// 計算當前區間的橫向長度sum += (long long)(x - prev_x) * current_y;current_y += offsetY;  // 更新縱向高度prev_x = x;            // 更新前一個指令點的橫坐標}// 處理最后一段到終點E的區間sum += (long long)(E - prev_x) * current_y;// 輸出結果cout << sum << endl;return 0;
}

代碼詳細解析

  1. 輸入處理

    • cin >> N >> E:讀取指令數 N 和終點橫坐標 E
    • prev_x 初始化為0(原點),current_y 初始化為0,sum 初始化為0。
  2. 循環處理每個指令

    • cin >> x >> offsetY:讀取當前指令點的橫坐標和偏移量。
    • sum += (x - prev_x) * current_y:計算當前區間的面積并累加。
    • current_y += offsetY:更新縱向高度。
    • prev_x = x:更新前一個指令點的橫坐標。
  3. 處理最后一段區間

    • sum += (E - prev_x) * current_y:累加最后一段到終點E的面積。
  4. 輸出結果:直接輸出總面積。


示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為0(0→1)、1×1=1(1→2)、1×2=2(2→3)、1×3=3(3→4),最后一段6×1=6(4→10),總和12。
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:0(0→1)、2×2=4(1→3)、2×5=10(3→5),總和14。
示例3輸入:
1 5  
5 3  

輸出

0  

解析

  • 區間0→5的面積是5×0=0,最后區間5→5長度為0,總和為0。

綜合分析

  1. 時間復雜度:O(N)

    • 僅需遍歷所有指令一次,時間復雜度與指令數N成線性關系。
  2. 空間復雜度:O(1)

    • 僅使用固定數量的變量,無需額外存儲所有指令點。
  3. 優勢

    • 高效直接:逐指令處理,無需復雜數據結構。
    • 內存友好:僅需常數空間。
    • 抗溢出:使用 long long 確保大數計算正確。
  4. 適用場景

    • 適用于指令數極大(如N=1e4)的場景,滿足時間與空間限制。

C

問題分析

我們需要計算繪圖機器繪制的路徑與x軸及x=E圍成的區域的面積。繪圖筆從原點出發,橫向移動到E,期間根據指令調整縱坐標。每個區間的高度由當前縱坐標決定,面積由區間長度乘以高度累加得到。


解題思路

  1. 輸入處理:讀取指令數N、終點E,以及每個指令點的x坐標和偏移量。
  2. 逐指令處理:按順序計算每個區間的面積并累加。
  3. 最終區間處理:計算從最后一個指令點到E的區間面積。
  4. 輸出結果:輸出總面積。

代碼實現

#include <stdio.h>int main() {int N, E;scanf("%d %d", &N, &E);  // 讀取指令數和終點坐標int prev_x = 0;    // 前一個指令點的x坐標(初始為0)int current_y = 0; // 當前縱坐標高度(初始為0)long long sum = 0; // 總面積,用long long防止溢出for (int i = 0; i < N; i++) {int x, offset_y;scanf("%d %d", &x, &offset_y);  // 讀取當前指令點// 計算當前區間的面積并累加sum += (long long)(x - prev_x) * current_y;current_y += offset_y;  // 更新縱坐標高度prev_x = x;             // 更新前一個x坐標}// 處理最后一段到E的區間sum += (long long)(E - prev_x) * current_y;// 輸出結果printf("%lld\n", sum);return 0;
}

代碼詳細解析

  1. 輸入初始化

    int N, E;
    scanf("%d %d", &N, &E);
    
    • 讀取指令數 N 和終點坐標 E
  2. 變量初始化

    int prev_x = 0;    // 初始位置為原點 (0,0)
    int current_y = 0; // 初始縱坐標為0
    long long sum = 0; // 總面積初始化為0
    
  3. 循環處理每個指令

    for (int i = 0; i < N; i++) {int x, offset_y;scanf("%d %d", &x, &offset_y);  // 讀取指令點的x坐標和偏移量
    
    • 逐個讀取指令點的橫坐標 x 和偏移量 offset_y
  4. 計算區間面積

    sum += (long long)(x - prev_x) * current_y;
    
    • 當前區間長度為 x - prev_x,面積為 長度 × 當前高度
    • 強制轉換為 long long 防止乘法溢出。
  5. 更新高度和坐標

    current_y += offset_y;  // 縱坐標累加偏移量
    prev_x = x;             // 更新前一個x坐標為當前值
    
  6. 處理最后一段到終點E

    sum += (long long)(E - prev_x) * current_y;
    
    • 無論是否有剩余區間,強制計算到終點E的面積。
  7. 輸出結果

    printf("%lld\n", sum);
    
    • 使用 %lld 格式符輸出 long long 類型的總面積。

示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為:[0,1)=0[1,2)=1×1=1[2,3)=1×2=2[3,4)=1×3=3[4,10)=6×1=6,總和為 12
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:[0,1)=0[1,3)=2×2=4[3,5)=2×5=10,總和 14
示例3輸入:
1 5  
5 3  

輸出

0  

解析

  • 區間 [0,5) 面積為 5×0=0,最后區間 [5,5) 長度為0,總和為 0

綜合分析

  1. 時間復雜度O(N)

    • 僅需遍歷所有指令一次,時間復雜度與指令數 N 成線性關系。
  2. 空間復雜度O(1)

    • 僅使用固定變量,無需額外存儲所有指令點。
  3. 優勢

    • 內存高效:無需預存所有指令點,逐個處理節省內存。
    • 計算安全:使用 long long 防止大數溢出。
    • 邏輯直接:嚴格按題意逐段計算,無復雜算法。
  4. 適用場景

    • 指令數極大(如 N=1e4)或終點坐標極大(如 E=2e4)的場景。

GO

問題分析

我們需要計算繪圖機器繪制的路徑與x軸及x=E圍成的區域的面積。繪圖筆從原點開始,橫向移動到終點E,期間根據指令調整縱向偏移。每個區間的高度由當前指令點決定的縱向偏移累積確定,面積由區間長度乘以高度累加得到。


解題思路

  1. 輸入處理:讀取指令數 N 和終點坐標 E,以及每個指令點的橫坐標和縱向偏移。
  2. 逐指令處理:按順序處理每個指令點,計算當前區間面積并累加。
  3. 更新高度:根據偏移量更新縱向高度,用于后續區間計算。
  4. 最終區間處理:計算最后一個指令點到終點E的區間面積。
  5. 輸出結果:輸出所有區間的總面積。

代碼實現

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)// 讀取第一行,包含N和Escanner.Scan()firstLine := strings.Fields(scanner.Text())N, _ := strconv.Atoi(firstLine[0])E, _ := strconv.Atoi(firstLine[1])prevX := 0    // 前一個指令點的橫坐標(初始為0)currentY := 0 // 當前縱向高度(初始為0)sum := int64(0) // 總面積,使用int64防止溢出// 處理每個指令點for i := 0; i < N; i++ {scanner.Scan()line := strings.Fields(scanner.Text())x, _ := strconv.Atoi(line[0])          // 當前指令點的橫坐標offsetY, _ := strconv.Atoi(line[1])    // 縱向偏移量// 計算當前區間的面積并累加interval := x - prevXsum += int64(interval * currentY)// 更新縱向高度和坐標currentY += offsetYprevX = x}// 處理最后一段到終點E的區間finalInterval := E - prevXsum += int64(finalInterval * currentY)// 輸出結果fmt.Println(sum)
}

代碼詳細解析

  1. 輸入初始化

    scanner := bufio.NewScanner(os.Stdin)
    
    • 使用 bufio.Scanner 讀取標準輸入。
  2. 讀取首行數據

    scanner.Scan()
    firstLine := strings.Fields(scanner.Text())
    N, _ := strconv.Atoi(firstLine[0])
    E, _ := strconv.Atoi(firstLine[1])
    
    • 解析首行輸入,分割為 N(指令數)和 E(終點坐標)。
  3. 變量初始化

    prevX := 0    // 初始橫坐標為0(原點)
    currentY := 0 // 初始縱向高度為0
    sum := int64(0) // 總面積初始化為0,用int64防止溢出
    
  4. 循環處理每個指令點

    for i := 0; i < N; i++ {scanner.Scan()line := strings.Fields(scanner.Text())x, _ := strconv.Atoi(line[0])offsetY, _ := strconv.Atoi(line[1])
    
    • 逐行讀取指令點,解析橫坐標 x 和偏移量 offsetY
  5. 計算區間面積

    interval := x - prevX
    sum += int64(interval * currentY)
    
    • 計算當前區間的橫向長度 interval,面積累加到 sum
  6. 更新高度和坐標

    currentY += offsetY
    prevX = x
    
    • 調整縱向高度 currentY,更新前一個橫坐標 prevX
  7. 處理最后一段到終點E的區間

    finalInterval := E - prevX
    sum += int64(finalInterval * currentY)
    
    • 計算最后一段的長度,并累加其面積。
  8. 輸出結果

    fmt.Println(sum)
    

示例測試

示例1輸入:
4 10  
1 1  
2 1  
3 1  
4 -2  

輸出

12  

解析

  • 區間面積依次為:[0,1)=0[1,2)=1×1=1[2,3)=1×2=2[3,4)=1×3=3[4,10)=6×1=6,總和 12
示例2輸入:
2 5  
1 2  
3 3  

輸出

14  

解析

  • 區間面積:[0,1)=0[1,3)=2×2=4[3,5)=2×5=10,總和 14
示例3輸入:
1 5  
5 3  

輸出

0  

解析

  • 區間 [0,5) 面積為 5×0=0,最后區間 [5,5) 長度為0,總和為 0

綜合分析

  1. 時間復雜度O(N)

    • 遍歷所有指令點一次,時間復雜度與指令數 N 成線性關系。
  2. 空間復雜度O(1)

    • 僅需常量級變量存儲當前狀態,無需額外存儲所有指令點。
  3. 優勢

    • 高效處理:逐個指令點處理,避免內存浪費。
    • 抗溢出:使用 int64 確保大數計算正確。
    • 邏輯清晰:嚴格按題目描述逐段計算,無冗余操作。
  4. 適用場景

    • 適用于指令數極大(如 N=1e4)或終點坐標極大(如 E=2e4)的場景。

更多內容:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文發表于【紀元A夢】,關注我,獲取更多實用教程/資源!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78274.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 Python(selenium) 的百度新聞定向爬蟲:根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容

該項目能夠根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容。 一、項目準備 1. 開發環境配置 操作系統:支持 Windows、macOS、Linux 等主流操作系統,本文以 Windows 為例進行說明。Python 版本:建議使用 Python 3.8 及以上版本,以確保代碼的兼容性和性能。…

MySQL表的操作 -- 表的增刪改查

目錄 1. 表的創建2. 表的查看3. 表的修改4. 表的刪除5. 總結 1. 表的創建 1.查看字符集及效驗規則 2. 表的創建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲引擎;創建用戶表1 創建用…

如何解決極狐GitLab 合并沖突?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 合并沖突 (BASIC ALL) 合并沖突發生在合并請求的兩個分支&#xff08;源分支和目標分支&#xff09;對相同代碼行進行了不同…

oracle不同數據庫版本的自增序列

-- 查看數據庫版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 語法 id NUMBER GENER…

VIC-3D非接觸全場應變測量系統用于小尺寸測量之電子元器件篇—研索儀器DIC數字圖像相關技術

在5G通信、新能源汽車電子、高密度集成電路快速迭代的今天&#xff0c;電子元件的尺寸及連接工藝已進入亞毫米級競爭階段&#xff0c;這種小尺寸下的力學性能評估對測量方式的精度有更高的要求&#xff0c;但傳統應變測量手段常因空間尺寸限制及分辨率不足難以捕捉真實形變場。…

pod 創建私有庫指南

步驟 參考&#xff1a;iOS Pod 私有庫創建指南-百度開發者中心 下面主要是對參考鏈接里面的解釋&#xff1a; 創建兩個倉庫&#xff1a; 一個叫podframe.git&#xff0c;用來存放自定義的framework&#xff0c;比如TestPodFrame.framework一個叫podspec.git&#xff0c;用來…

【JavaEE】Spring AOP的注解實現

目錄 一、AOP 與 Spring AOP二、Spring AOP簡單實現三、詳解Spring AOP3.1 Spring AOP 核心概念3.1.1 切點&#xff08;Pointcut&#xff09;3.1.2 連接點&#xff08;Join Point&#xff09;3.1.3 通知&#xff08;Advice&#xff09;3.1.4 切面&#xff08;Aspect&#xff09…

協作開發攻略:Git全面使用指南 — 結語

協作開發攻略&#xff1a;Git全面使用指南 — 結語 Git 是一種分布式版本控制系統&#xff0c;用于跟蹤文件和目錄的變更。它能幫助開發者有效管理代碼版本&#xff0c;支持多人協作開發&#xff0c;方便代碼合并與沖突解決&#xff0c;廣泛應用于軟件開發領域。 文中內容僅限技…

如何用AI主動突出畫面主體!涂鴉新方案助剪輯、工業巡檢、醫療影像等領域,實現自動追蹤+智能放大

隨著智能 IPC 設備&#xff08;如安防攝像頭、寵物陪伴機器人、嬰兒監視器等&#xff09;日益普及&#xff0c;越來越多的生活場景被實時記錄。然而在實際使用中&#xff0c;由于設備安裝位置不當、廣角鏡頭視野過大等原因&#xff0c;經常會出現拍攝主體占比過小的問題&#x…

數據湖DataLake和傳統數據倉庫Datawarehouse的主要區別是什么?優缺點是什么?

數據湖和傳統數據倉庫的主要區別 以下是數據湖和傳統數據倉庫的主要區別&#xff0c;以表格形式展示&#xff1a; 特性數據湖傳統數據倉庫數據類型支持結構化、半結構化及非結構化數據主要處理結構化數據架構設計扁平化架構&#xff0c;所有數據存儲在一個大的“池”中多層架…

當智駕成標配,車企暗戰升級|2025上海車展

文&#xff5c;劉俊宏 編&#xff5c;王一粟 智能化無處不在的2025年上海車展&#xff0c;回歸了賣車的初衷。 光錐智能在展會暴走兩天&#xff0c;最大的感觸是今年的車展少了爭奇斗艷&#xff0c;多了些許務實。 回顧智能汽車時代的三場重要車展。2023年的上海車展充滿了…

如何在Spring Boot中禁用Actuator端點安全性

在 Spring Boot 應用中&#xff0c;Spring Boot Actuator 提供了一系列用于監控和管理應用的端點&#xff08;如 /actuator/health、/actuator/metrics&#xff09;&#xff0c;這些端點默認可能受到 Spring Security 的保護&#xff0c;要求身份驗證或授權。然而&#xff0c;在…

【mongodb】系統保留的數據庫名

目錄 1. admin2. config3. local4. test&#xff08;非嚴格保留&#xff0c;但常作為默認測試數據庫&#xff09;5. 注意事項6. 其他相關說明 1. admin 1.用途&#xff1a;用于存儲數據庫的權限和用戶管理相關數據。2.特點&#xff1a;該數據庫是 MongoDB 的超級用戶數據庫&am…

Redis是單線程的,如何提高多核CPU的利用率?

一句話回答&#xff1a; Redis 是單線程處理客戶端命令&#xff0c;但可以通過 多實例部署、I/O 多路復用、后臺線程 Redis 6 的 I/O Thread 支持&#xff0c;來充分利用多核 CPU。 一、Redis 單線程 ≠ 整個 Redis 都是單線程&#xff01; Redis 主要的 網絡事件 命令執行 …

關于mysql的事務和索引

1. 事務四大特性&#xff08;ACID&#xff09; 原子性&#xff1a;事務的操作要么全部成功&#xff0c;要么全部失敗回滾&#xff0c;不可分割。 一致性&#xff1a;事務執行前后&#xff0c;數據必須滿足業務規則&#xff08;如賬戶總額不變&#xff09;。 隔離性&#xff1…

【Python】保持Selenium穩定爬取的方法(防檢測策略)

selenium 防檢測策略的方法匯總&#xff1a; 合理設置延遲&#xff1a;請求間添加隨機延遲 (2-10秒) 限制爬取頻率&#xff1a;控制每小時/每天的請求量 輪換用戶代理&#xff1a;準備至少10個不同的User-Agent 使用住宅代理&#xff1a;優先選擇高質量的住宅代理IP 處理驗…

SpringSecurity源碼解讀AbstractAuthenticationProcessingFilter

一、介紹 AbstractAuthenticationProcessingFilter 是 Spring Security 框架里的一個抽象過濾器,它在處理基于表單的認證等認證流程時起著關鍵作用。它繼承自 GenericFilterBean,并實現了 javax.servlet.Filter 接口。此過濾器的主要功能是攔截客戶端發送的認證請求,對請求…

什么是DDD?為什么它正在取代傳統架構?

什么是DDD&#xff1f;為什么它正在取代傳統架構&#xff1f; 1. 傳統開發模式的痛點 在經典的MVC架構中&#xff0c;開發流程往往從數據庫表結構設計開始&#xff0c;業務邏輯散落在Service層&#xff0c;隨著需求迭代容易形成「大泥球」代碼&#xff1a; 實體類變成純粹的…

基于外部中中斷機制,實現以下功能: 1.按鍵1,按下和釋放后,點亮LED 2.按鍵2,按下和釋放后,熄滅LED 3.按鍵3,按下和釋放后,使得LED閃爍

題目&#xff1a; 參照外部中斷的原理和代碼示例,再結合之前已經實現的按鍵切換LED狀態的實驗&#xff0c;用外部中斷改進其實現。 請自行參考文檔《中斷》當中&#xff0c;有關按鍵切換LED狀態的內容, 自行連接電路圖&#xff0c;基于外部中斷機制&#xff0c;實現以下功能&am…

在SQL中,FROM子句中的子查詢必須指定別名,即使后續未引用該別名

FROM子句中的子查詢必須指定別名 示例錯誤示例及原因&#xff1a;總結&#xff1a; 在SQL中&#xff0c; FROM子句中的子查詢必須指定別名&#xff0c; 即使后續未引用該別名 示例 查詢館藏圖書最多的作者姓名及館藏數量 SELECT 作者, COUNT(圖書編號) AS 館藏數量 FROM 圖…