出處: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=41
問題敘述
此問題會輸入很多組長方形建築物的資料,每組資料分別是: 左x座標, 高度, 右x座標,輸入資料會照著左x座標由小到大排序,得到所有建築物的資料之後,必須輸出"天際線向量"。所謂天際線向量,就是用一個長的像這樣子的向量: (v1, v2, v3, ... , vn) 來表示天際線,奇數位置填的是x座標,偶數位置填的是高度,必須從最小的x座標開始填起。
解題思路
這題有一個可以減少我們很多功夫的關鍵點,那就是所有座標都是小於10,000的整數,也就是說我們只要開一個10,000個元素的陣列,暴力記下每一個x座標的最高點,就可以完成天際線向量了。所以此題的演算法大致上是如此: 每讀入一組建築物資料,就更新那一區塊的所有x座標的最高點(注意不要更新到建築物最右邊座標的高度,因為這樣才能知道哪個x座標開始產生高度變化),最後只要從小到大把每個x座標的最高點掃描一遍,就可以印出天際線向量了。
c++ 程式碼
#include <iostream> #include <vector> using namespace std; int main() { int left, right, height, last; int first = -1; int nowHeight = 0; vector<int> heightVec(10000, 0); while (cin >> left >> height >> right) { if (first == -1) { first = left; last = right; } if (right > last) last = right; for (int i=left; i<right; i++) { if (height > heightVec[i]) heightVec[i] = height; } } for (int i=first; i<=last; i++) { if (heightVec[i] != nowHeight) { cout << i << " " << heightVec[i]; if (i == last) cout << endl; else { cout << " "; nowHeight = heightVec[i]; } } } return 0; }
沒有留言:
張貼留言