USACO演算法系列五 rect1

2021-09-30 08:15:52 字數 790 閱讀 6976

題目:

最簡單的想法是宣告乙個n*n的二維陣列,用於表示單位1的矩形,二維陣列的初始值為1,表示初始的顏色。一層一層的往上覆蓋,不斷更新陣列的顏色值,最後統計一下二維陣列裡面各個顏色的個數就可以得出結果了。然而這種想法存在著嚴重的缺陷,第一時間,每次更新都需要更新a * b的空間,因此時間為o(n*a*b),加上最後統計,因此時間為o( a * b),因此最後的時間為o(n*a*b),a*b已經達到1億次了,顯然會超時。第二空間,按照題目的要求 1<= a,b<= 10000,因此最大的二維陣列為乙個億的空間,即使是最短的short(因為顏色有2500種),空間超過要求了。

為了節約空間,我想了乙個方法是:乙個單元最後的顏色取決於最後乙個矩形在這個單元上的著色。即這個單元最後落在了哪個著色矩形當中,如果把著色的矩形倒過來考慮,那麼就容易多了,就是這個單元最先出現在逆序的矩形單元當中。這樣就可以不必儲存乙個10000 * 10000的二維陣列了。遺憾的是,時間並沒有得到縮減,遍歷乙個陣列的時間是o(a*b),每次遍歷必須考慮n個矩形,因此時間複雜度仍然是o(n*a*b)。

懷著僥倖的心理,我還是將他實現了一下。**如下:

結果很顯然,在test11的時候超時了。 

接著昨天的內容,按單元掃瞄發現時間會超時,為了提速,想到了圖形學裡面的按行掃瞄填充多邊形的演算法。其實原理很相似,我們能不能逐行掃瞄,然後計算行通過矩形的長度呢?這樣就可以一口氣處理一行。同樣的,我們將行跟逆序的矩形比較,如果這一行通過矩形,計算在通過矩形的長度,並將線段分成兩段繼續迭代到下一層矩形掃瞄。如此迭代,直到到達底層。剩下的線段就是底層的顏色長度了。**如下:

程式執行通過了,測試時間如下:

USACO演算法系列十八 game1

題目 http www.nocow.cn index.php translate usaco game1 很有趣的一道題目,兩個人輪流從一串數字的兩端拿數字,要求使自己拿到的數字總和最大。如果使用回溯的方法,限定不能保證最優的情況,即最優情況不知道怎麼界定。可以用動態規劃的思想來考慮,用map i ...

基礎演算法 usaco 3 1 4 rect1

問題 描述n個不同的顏色的不透明的長方形 1 n 1000 被放置在一張橫寬為a豎長為b的白紙上。這些長方形被放置時,保證了它們的邊與白紙的邊緣平行。所有的長方形都放置在白紙內,所以我們會看到不同形狀的各種顏色。座標系統的原點 0,0 設在這張白紙的左下角,而座標軸則平行於邊緣。編輯 格式 prog...

USACO演算法系列十四 fence

題目 http www.nocow.cn index.php translate usaco fence 看完這道題目的第一想法就是,遍歷所有的邊,而且每一條邊的經過次數只能一次。是離散數學裡面的圖論的尤拉通路問題,在這裡充分體現了數學的重要性。定理 無向圖g有尤拉通路的充分必要條件是g為連通圖,並...