Problem
每一個飛機的安全範圍視為在三維空間平行三軸的六面體,給定 n 台飛機的安全範圍,請問重疊至少兩次的空間體積為何?
Sample Input
|
|
Sample Output
|
|
Solution
離散化 X Y Z 軸出現的座標值,壓縮成 n * n * n
的三維陣列,接著將每一台飛機的安全範圍離散化後,將其所在的位置進行標記。
離散化後,每一格將會具有不同的長度,把離散的數據聚集在一起,而事實上在工程數學中,離散化一詞則是將連續的數據變成整數離散的情況。
|
|
每一個飛機的安全範圍視為在三維空間平行三軸的六面體,給定 n 台飛機的安全範圍,請問重疊至少兩次的空間體積為何?
|
|
|
|
離散化 X Y Z 軸出現的座標值,壓縮成 n * n * n
的三維陣列,接著將每一台飛機的安全範圍離散化後,將其所在的位置進行標記。
離散化後,每一格將會具有不同的長度,把離散的數據聚集在一起,而事實上在工程數學中,離散化一詞則是將連續的數據變成整數離散的情況。
|
|
給一個平面圖的樹,請問是否同構,每一個節點相鄰的邊將會按照逆時針的順序給定。
|
|
|
|
這一題與 UVa 12489 - Combating cancer 有點不同,這一題限制在平面圖,因此邊的紀錄是有順序性的。而題目不僅要求結構相同,同時在節點上面的 label 也要相同。
但是只要固定一個當作根,成為一個有根樹,那麼在最小表示法中,除了根的分支可以旋轉外,其餘的節點的分支都不能旋轉。因此固定其中一棵樹的根節點,接著窮舉另外一棵樹哪個節點作為根節點,分別找到最小表示法進行比對即可。
|
|
給一個凸多邊形,接著再給定一射線的起始位置和角度,請問經過 m 次反射後的位置為何?如果射線打入凸多邊形的端點時,視如射線遺失。
|
|
|
|
模擬每一步的射線可能打入的凸邊形的邊,因此每一次反射將要窮舉所有邊,查看是否存在線段與射線相交,如果發現此一可能再找到下一個反射線的起點與方向向量。
找到反射線的起點很簡單,直接用線段交即可找到,問題是在於方向向量怎麼計算,如果是用角度旋轉會造成嚴重的誤差。因此先把射線起點投影到線段上,接著再打到對稱點,然後從對稱點拉到交點得到方向向量,這麼做會降低嚴重的誤差問題。
|
|
動物園的 4 種動物配置,動物都有地域性,不希望相鄰的地方會具有與自己相同的物種。
給一個 graph,最多用四個顏色著色,使得相鄰不同色,輸出任意種方案即可。
|
|
|
|
看起來 N 還算大,窮舉順序會稍微影響速度,依序窮舉節點,檢查是否存在相鄰同色。由於不曉得是不是只有一個連通元件,連通元件分開找解,防止浪費時間的搜索。
接著根據 bfs 順序進行窮舉,來加快退回的速度。事實上也發現到四色問題如果保證有解,事實上應該很容易找到其中一組解。
|
|
有兩個玩家 A, B,盤面上有三個骰子,先手先挑一個骰子出來,後手再從剩餘兩個骰子中挑一個。接著兩個人會分別骰出點數,骰出最大的那個玩家獲勝,如果骰出一樣點數則平手
給予先手玩家,和三個六面骰子,請問獲勝機率高的玩家為何?
|
|
|
|
先手必然是最大化自己的獲勝機會下,最小化對方的獲勝機會。而後手則是在剩餘兩個骰子的時候,挑選獲勝機會最高的那個骰子。
因此這一題窮舉先手拿哪一個骰子,模擬後手選剩餘哪個骰子獲勝機會最高,最大化先手的獲勝機會下、最小化後手獲勝機會。
題目描述相當少,就當作是兩個完美玩家吧。
|
|
有一長度為 n 的都市地帶,每一次將會做區段的都市更新,將建築物都增加高度 v。
操作
[X, Y]
都增加 V 高度(題目中的圖示貌似有錯誤)
|
|
|
|
想要區間更新、單點查詢,有兩種方案 segment tree 附加懶操作、或者 binary indexed tree、最後是塊狀鏈表這幾種方式。這裡使用 binary indexed tree。雖然 binary indexed tree 原本的操作是單點修改,前綴總和查找。利用這一點完成區間修改的操作。
由於這一題還是單純的加法,那麼符合加法原則,當區間修改 B X Y V 時,相當於修改單點 Arr[X] += V,Arr[Y+1] -= V
,從前綴和 SUM[1...Z] = \sum Arr[i]
來看,保證只有區間 [X, Y]
的詢問增加了 V 值,其他保持不變。
單筆操作都是 O(log n)
|
|
給定七巧板拼圖,保證每一個拼圖都會在最後的盤面上,並且每一個拼圖不可旋轉。
但是在輸出的時候,選擇一個最大權重的表示法進行輸出,同時每組測資保證最多一種同構解。
|
|
|
|
轉換成精準覆蓋問題,套用 DLX 做法來完成。
特別小心輸出的表示法,計算權重時,有可能會有嚴重的 overflow,可以用大數比大小、或者 double 來完成。
|
|
給予 AND, OR, NOT 結合的電路圖,保證最多 26 個變數,分別由大寫字母表示,接著對於每一組詢問輸出電路結果。
|
|
|
|
不想轉化成 graph,那麼就直接針對盤面做遞迴分析,特別要記錄之前的方向位置,以免電路接錯路徑。而題目沒有說明 ?
銜接的方向,有可能四個方向都有。一開始沒有注意到這個問題,導致刷了很多 RE。
|
|
給定一個方程式,接著繞 x 軸旋轉,計算區間 [l, r]
的體積。
考慮積分與數值積分的情況,計算兩者之間計算的誤差。其中會給定數值積分在 x 軸劃分的依準,以及繞行 x 軸轉換要切幾等分。
|
|
|
|
這題最麻煩就是計算椎台體積
在幾何學中,錐台又稱平截頭體,指的是圓錐或稜錐被兩個平行平面所截後,位於兩個平行平面之間的立體。根據所截的是圓錐還是稜錐,可分為圓台與稜台。
參照 wiki Frustum
兩平行的上下底面積 S1, S2,根據高度 h,得到體積 V = (S1 + S2 + sqrt(S1 * S2)) /3 * h
。之後就模擬劃分計算體積。
|
|
給定一些學生的成績,希望建造一個分級制度,使得每一級的人數差距越少越好。
分級制度化分成 A, B, C, D 四級,每一級都是一個連續區間,假設現在有 N 個人,期望能將每一堆分成 N/4 個人,把每一堆人數與期望的 N/4 的差總和越小越好。
輸出字典順序最小的劃分方式。
|
|
|
|
如何直接窮舉劃分線,想必也要消耗 O(160^3) 的時間。這花費太昂貴。
發現到每一個人的分數並不高,落在 0 - 160 之間的整數,那麼先統計每個分數有多少人。
接著考慮 dp[i][j]
前 i 個分級制度,劃分線為 j 的最小差總和。接著加入下一級,得到
|
|
因此需要 O(4 * 160 * 160)
來完成。考慮輸出最小字典順序的劃分方式,一樣採用 dp 的思路,逆推回去查看是否能得到目標的最佳解,之後再順著被標記的路線走即可。
|
|