切換
舊版
前往
大廳
主題

ZeroJudge - d789: 00920 - Sunny Mountains 解題心得

Not In My Back Yard | 2020-07-04 17:59:46 | 巴幣 0 | 人氣 199

題目連結:


題目大意:
第一列給定正整數 C (0 < C < 100),代表有 C 筆測試資料。每筆第一列給定一正整數 N (N ≦ 100),代表有 N 個點。接著有 N 列輸入,每列給定兩非負整數 x 、 y (0 ≦ x ≦ 30000 , 0 ≦ y ≦ 8848),代表這 N 個點各自的 X 、 Y 座標。

這 N 個點保證沒有兩點的 X 座標是一樣的,且最左邊的點之 X 座標為 0 、 最右邊的點之 Y 座標為 0 。而這 N 個點代表了一連串的山巔與山坳(保證會交錯出現)。

現在陽光從 +X 方向平行地射往 -X 方向(由右往左),試問這些山的向陽面積(實際上是線段長)為多少?

如下圖的紅線處即是向陽面,因此所求是紅線的總長:



範例輸入:
2
11
1100 1200
0 500
1400 100
600 600
2800 0
400 1100
1700 600
1500 800
2100 300
1800 700
2400 500
2
0 1000
1000 0


範例輸出:
1446.34
1414.21


解題思維:
因為右邊的山會擋住左邊的山之陽光,因此我們先藉由 X 座標將這 N 個點由大到小排序好。此時第一個點就是最右邊的點。

可以看到最右邊的點與其左邊一個的點會形成一個山坡,而這個山坡會完全照射到太陽且高度為左邊的點之 Y 座標。

紀錄「目前」最高的山坡的屌端高度(也就是 Y 座標的極大值)。而每遇到一個點 i 與前一個點 i - 1(已排序的狀況下),點 i 的 Y 座標較高時。代表這兩個點會形成一個山坡。

假設目前最高為 M ,當前山坡最高點 Y 座標為 y 、最低點為 y',。如果 y ≦ M ,代表該山坡會被先前的山坡(較右側的)所擋住。如果 y > M,則先算出這個山坡的長(點 i 與點 i - 1 的連線長)。然後乘以 (y - M) ÷ (y - y') ,代表超出的部分之向陽面積(線段長)。然後更新目前最大 M ← Y ,因此 Y 變成了目前最大。

依照上面的方式掃過所有點之後,期間的線段長總和即是所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作