d424: 00105 - The Skyline Problem

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

CPE 一顆星

題目連結:https://zerojudge.tw/ShowProblem?problemid=d424

內容

所有的建築物都是矩形的,並且都建築在同一個平面上。
給定多棟建築物數據,求出這些建築物的空中輪廓(skyline)。

每列有一棟建築物資料,包含左邊位置 Li 、高度 Hi 、右邊位置 Ri。

所有數字都小於 10000,建築物已按照 Li 排列。

範例輸入

1 11 5
2 6 7
3 13 9
12 7 16
14 3 25
19 18 22
23 13 29
24 4 28

範例輸出

1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0

想法

使用一個陣列紀錄該點最大建築物高度,一次讀取一棟建築物,若高於先前建築物,則更新。並紀錄最後一棟建築物的右邊位置。

接著遍歷陣列,若相鄰點高度不同,則輸出位置與高度。

程式碼

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

int main(){
fastio;
int Li, Hi, Ri, high[10001], R = -50;
memset(high, 0, sizeof(high));
while(cin >> Li >> Hi >>Ri){
for(int i = Li; i < Ri; ++i){
high[i] = max(Hi, high[i]);
R = max(Ri, R);
}
}
for(int i = 0; i <= R; ++i){
if(high[i] != 0 && i == 0){
cout << "0 " << high[i] << " ";
}
else if(high[i] != high[i+1]){
cout << i+1 << " " << high[i+1] << " ";
}
}
return 0;
}