Problem
給定一個 n x m 的網格,現在要紮營於格子上,但是每一格的高度不同,希望使用 k 個格子,他們可以藉由上下左右四格相連,找一種方案,使得最低、最高紮營高度差最小。
Input
|
|
Output
|
|
Solution
由於高度介於 0 到 100 之間,考慮窮舉最低紮營處的高度 l。採用掃描線的方式,依序加入高度較低的地點,直到其中一個連通子圖的節點總數大於等於 k。
為了加速,使用并查集來完成合併連通子圖。
|
|
給定一個 n x m 的網格,現在要紮營於格子上,但是每一格的高度不同,希望使用 k 個格子,他們可以藉由上下左右四格相連,找一種方案,使得最低、最高紮營高度差最小。
|
|
|
|
由於高度介於 0 到 100 之間,考慮窮舉最低紮營處的高度 l。採用掃描線的方式,依序加入高度較低的地點,直到其中一個連通子圖的節點總數大於等於 k。
為了加速,使用并查集來完成合併連通子圖。
|
|
給定一種特殊的騎士走法,請問在 n x m 格子上,從 (x, y) 到 (a, b) 的步數情況,走訪時不能重複經過相同點。
若能恰好在質數步抵達,輸出最少的步數。如不是質數,輸出合數的最少步數。都還是不行則輸出無法抵達。
|
|
|
|
這題麻煩的地方在於恰好在質數抵達,那麼考慮使用 IDA 來完成,在搜索時發生不是在質數步數抵達回傳無解,繼續迭代加深。估價函數為當前座標 (x, y) 到 (a, b) 的最短距離。
在做 IDA 之前,使用 Bfs 查看移動所需步數,若恰好是質數則直接輸出答案,若保證無法抵達終點,輸出無解。最後再進行 IDA 搜索,來加快處理程序。
根據測試,使用的質數步數不大於 11。
|
|
給一個只有加法、乘法和括弧的運算式,在不改變最後的答案下,有多少種不同的運算順序 (不同的 parse tree)。
|
|
|
|
類似矩陣鏈乘積的 O(n^3) 解法。
dp[l, r]
表示表達式 exp[l, r]
正確的方法數。當運算式存在加法時,不能拆分乘法運算。只剩下乘法運算時,才能拆分乘法運算。
|
|
瘋狂的島嶼上有 n 個野蠻人、m 個山洞,山洞呈現環狀分佈。
每個野蠻人一開始各自在自己的洞窟 Ci,每隔一天就會移動到下 Pi 個山洞,在島上待 Li 天後就會死亡。
兩個野蠻人若剛好移動到相同洞窟,則會發生爭吵,請問至少要幾個洞窟,才能不發生爭吵。
|
|
|
|
窮舉洞窟數量 m,檢查是否存在爭吵。
檢查任兩個野蠻人 i, j 是否會在生存時間內相遇,假設會在第 k 天相遇,滿足公式
|
|
將公式整理後
|
|
檢查 k 最小為多少,使得等式解存在。
套用擴充歐幾里德算法,得到 ax + by = gcd(x, y)
的第一組解 (a, b)
,其 a, b 的參數式為
|
|
最小化 a 參數,滿足 a >= 0
,隨後檢查可行解即可。
|
|
有隻猴子在樹間,每一棵樹有平行的分支,猴子可以在兩棵樹的分支端點跳躍,並且跳躍距離不超過歐幾里德距離 K
,並且跳躍的時候只能跳端點的直線上,同時不能撞到其他分支,否則視如跳躍失敗。
猴子從樹幹走到分支端點、端點走到樹幹是需要計算步行花費,請問從第一棵樹走到最後一棵樹,最少的步行花費為何。
|
|
|
|
分支數量很少,直接暴力嘗試跳躍的可行性。使用外積解決線段交問題,隨後計算跳躍的最少花費,記錄狀態 dp[i]
表示從第一棵樹走到第 i 棵樹的最少步行成本。
特別小心當跳躍都無法時,可以走在地面上,由於這一點掛了好多 WA。
|
|
給一個橢球的三個參數,一刀縱切橢球,問切割橢球的截面積為何。
|
|
|
|
回顧積分公式,得到橢圓面積。將橢球固定一個參數,調整計算截面積。公式如代碼中所附。
$$\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1 \\ \text{area } = ab\pi \\ \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1 \\ \frac{x^2}{(a \sqrt{1 - z^2 / c^2})^2} + \frac{y^2}{(b \sqrt{1 - z^2 / c^2})^2} = 1 \\ \text{cross-sectional area} = ab (1 - z^2 / c^2) \pi \\$$
|
|
給予 n 種酒瓶,每一種酒瓶有其裝酒的容積上下限 [min, max]
毫升,請問將 m 公升的酒裝入酒瓶,最後剩餘的最少量為多少。
每一種酒瓶可以無限使用。
|
|
|
|
這一題需要剪枝,無法單純地運行背包 dp,單純的背包 dp 很容易造成 TLE。
發現到只考慮使用一種酒瓶,那麼當酒量大於某個定值後,保證都能裝完。假設使用單一酒瓶的數量為 k 個以上時,能裝出所有量,則能覆蓋的區間為
|
|
當第 k+1 個區間的左端點小於第 k 個區間的右端點時,可以得到接下來的所有區間都會發生重疊。推導得到 (k+1)*min >= k*max
最後條件 k >= min / (max - min)
。
滿足保證能裝出,直接輸出答案 0
,否則做背包 dp。
|
|
windows format to linux format
|
|
[A. Counter Culture]
給定一個數字 N,要求藉由兩種操作從 1 變成 N,第一種操作將當前數字 x 變成 x + 1,第二種操作為 x 變成 reverse(x),並且消除前導為零。求操作的最少次數。
由於 N 很大,搜索沒有搞頭,但關於反轉數字能理解到,當後半部恰好等於目標的前半部時,此時反轉最有利,根據貪心策略進行反轉操作,但要防止前導為 0。關於 x + 1 部分,主要是增加位數。
這時候來逆推吧!降位數 (1000 -> 999, 10000 -> 9999)、反轉貪心 (123654 -> 100321)、WTF 的情況 (19 -> 11 -> 10)。在 WTF 的情況中,反轉無效,怒降一個數字。
[B. Noisy Neighbors]
在 R x C 的網格上,每一格可以租給一個用戶,當用戶之間共享一個邊時,將會增加不滿意程度,求租給 K 名用戶,建築的不滿意程度最低為何。
考慮 K 小的時候,將網格黑白染色,必然只放置在黑色或白色網格上,此時不滿意程度皆為 0。當 K 多餘白色格子或黑色格子時,將會增加不滿意程度,每當增加一格,勢必會挑選相對的顏色 (填滿白色格子後,選黑色格子來填),那麼每一次必須挑最少相鄰邊的格子。
為什麼一定會填滿其中一種顏色?假設最優解存在其中一種顏色未填滿,且存在這一格 x 附近沒有使用的格子,那麼必然存在將一個產生不滿意的格子移動到 x 會是一個更優解。不斷地迭代下去,就是貪心的來源!
[C. Hiking Deer]
跟蹤狂 H 在一個圓從 0 出發繞一圈,H 很討厭人群,因此盡可能不與其他人碰面,H 的能力可以跟蹤在任何人身後。現在知道一群人會不斷地繞著這個圓,並且分別以各自的速度、當前位置,全部人都按著順時針方式繞行,不存在兩個人在相同地點以相同速度。現在從 time = 0 開始,請問 H 至少會發生幾次碰面。
由於是一個環狀,又要考慮繞行的區間最少人數,朝著掃描線思路邁進!保證答案 (碰面次數) 不超過總人數 N,一開始瞬間移動到最快抵達終點的人身上,只會碰到 N - 1 個人!
根據抵達終點的時間排序,維護當前需要的碰面次數 e,假設尾隨編號 i 的人,需要碰面 e 個人!經過掃描一些人後,又遇到 i,表示 i 又繞了一圈,那麼碰面次數 e = e + 1,讓尾隨後面的點時,都會遇到那該死的 i!
|
|
|
|
|
|
期末上繳報告啊,不知道要寫多少才對得起自己。理解正確性不敢保證,相當可怕。
The Sinogram Polygonizer for Reconstructing 3D Shapes 這篇論文主要拿 Grid-base 掃描重建方法以及根據取樣點重建 3D 模型的算法探討。
首先從離散取樣中重建,最基礎的做法是根據 z-index 作切割,得到 xy 平面,在其上作 Grid-base 網格狀的取樣,得到座標 (x, y, z) 是否在該物體內部。
當取樣數量越多時,密集程度越高,能造就的邊緣就越明顯。藉由 Grid-base 取樣的缺點在於邊緣的凸顯仍然不夠明確於三角化,取樣點的數量必須非常多,才能表示非平行三軸的邊緣。
從 CT 圖中,掃描資料為數張正弦圖 (sinogram),將一個物體放置於轉盤上,轉動轉盤將 X 光照射上去,根據物體的阻射程度得到正弦圖,相當於是光線投影到平面的強度 (CT value)。當一個物體只由一種材質構成時,其阻礙程度與阻礙光線的長度成線性關係,如此一來 CT value 就能有效地反應在物體表面的距離。
這裡補充一點,通常物體不會只由一個材質構成,因此在某些重建工作時會特別弱,如人體掃描重建,則會在眼睛材質上難以得到好的效果。阻礙能力會擴散到其他的正弦圖上,在複合材料的重建工作則會相對地困難。
CT 圖存在些許的干擾,受到鄰近材質的阻射影響。看到網路上文章寫到,即便現代的降噪算法相當厲害,對於醫院普遍使用的成像仍然使用幾十年前的算法,其最重要的原因是擔憂降噪算法捨棄掉的部分到底是不是正確的,去掉資訊若是重要的反而會造成判斷失誤,因此學術界使用 CT 圖的降噪算法仍然不普及於醫學界。
目前 Shepp-Logan filter 相當好用,在 CT 去噪效果受到肯定!公式如下:
$$f(p) = \frac{1}{2} \int_{0}^{2 \pi} \alpha(R_\theta p)^{2} S_{\theta}(P(R_{\theta} p)) d \theta \\ S_{\theta}(q) \leftarrow \int_{-\infty }^{\infty} {\beta(\tilde{q}(x)) S_{\theta}(\tilde{q} (x)) h(x - (q)_{x})} dx \\ h(t) = 2 / (\pi^{2} \delta^{2} - 4 t^{2}) \\$$ $S_{\theta}(q)$ 表示在轉盤角度為$\theta$ 時成像於 q 點的數值$\beta(q) = cos(\angle qso)$,點 q 連線到光源 s、再連線到圓盤圓心點 o。並且$\tilde{q}$ 限定為與點 q 具有相同的 y 值,就是說對水平方向上鄰近點數值去噪$\delta$ 為取樣的像素大小於成像畫面。對於相鄰的四面體,計算 $Tiso= (f(gi)+f(gj))/2$ 接下來要找等值曲面 $Tiso$,找到一個點 p 位於等值曲面上,並且 p 在 gi, gj 的連線上。對於 p 所在的等值曲面上計算法向量 $n_{k}$,等下要用來計算 QEM 用的。
下篇待續
依序背單字,下一個單字中要出現當前單字為 substring 的情況,每一個單字都有各自的權重,求背一次能得到的最高權重總合為多少。
如範例輸入背的順序為 a -> ab -> abb -> abbab
答案為 1 + 2 + 3 + 8 = 14
。
|
|
|
|
這一題的測資有問題,輸入中出現非小寫字母,導致存取發生錯誤,部分程序沒有考慮這一點,居然就通過了?
一群人 Invalid Memory Access 通過,而我因寫法比較不同成了 RE 下亡魂,測試數據格式錯誤啊!坑爹啊,害我掛載好多 assert 抓哪裡溢出 …
原本想說是一道有趣的 AC 自動機複習,將 fail 指針 (suffix link) 整理成另一棵樹,對其 fail tree 壓樹 (走訪),套上線段樹等數據結構,就能支持多字串匹配的數據查找。當匹配時將會一直攀爬 fail 指針,最後爬到 root,中間經過的節點都是匹配的字串,也因此單看 fail 指針,也肯定是 tree。
在走訪時,會匹配 fail link 上的所有節點 (都是其 suffix string)。dp[i]
表示使用第 i 個字串為背單字序列結尾的最大權重,則 dp[i] = max(dp[j]) + w
,其中滿足 j < i 且 word[j] 是 word[i] 的 substring。
窮舉第 i 字符串的後綴匹配節點,找尋匹配節點藉由 fail link 到 root 上節點的最大值 (max(dp[j])
)。
利用線段樹完成區間最大值更新、單點查詢 (找尋節點到 root 的最大值,更新一個點的權重時,相當於作區間最大值更新,藉由壓樹其子樹被表示成區間)。
|
|