itint5 擺放視窗

2022-04-11 03:32:10 字數 1115 閱讀 7822

一種做法是:把矩形所佔的方格都設為-1,就是個最大子矩陣和問題。複雜度o(w^2*h)或o(w*h^2),空間w*h

猜想應用場景是:電腦螢幕上已經有了n個聊天框,新建乙個聊天框,放在螢幕的哪個位置最好。客戶端計算的話,空間複雜度太高的演算法應該是沒法實際應用的。這種方法oj也會空間超出。

另一種做法(貪心思想,和乙個矩形覆蓋最小):

所求矩形的上邊要麼貼著邊界,要麼貼著某個已有矩形的下邊

所求矩形的下邊要麼貼著邊界,要麼貼著某個已有矩形的上邊

所求矩形的左邊要麼貼著邊界,要麼貼著某個已有矩形的右邊

所求矩形的右邊要麼貼著邊界,要麼貼著某個已有矩形的左邊

總可以找到乙個滿足最小覆蓋條件的矩形,這個矩形的邊要麼與大視窗的邊緣重合,要麼和已知矩形的邊重合。可以使用常見的貪心思想證明,假設有任意乙個滿足最小覆蓋條件的矩形,總可以將其移動到與已有的邊重合。

這樣,只需要列舉o(n^2)的左上點座標,總的時間複雜度o(n^3)。

可以這樣理解,假設已經把矩形放在乙個位置了,先只考慮上下移動(左右同理),那麼在上下邊遇到另一條橫邊之前,往上移動覆蓋面積要麼單調遞增要麼單調遞減(也可以覆蓋不變),往下移動單調性相反。那麼總能移動到和某一條邊重合併比原來覆蓋面積相等或更小的。所以假設已經找到乙個滿足最小覆蓋條件的矩形,那麼可以將其移動到與已有的邊重合。

注意:求兩個矩形相交部分的面積的寫法也很值得參考。

int x = max(0, min(a.x2, b.x2) - max(a.x1, b.x1));

int y = max(0, min(a.y2, b.y2) - max(a.y1, b.y1));

return x * y;

} if (rects.size() == 0) return 0;

vectorx, y;

x.push_back(0); x.push_back(h-h);

y.push_back(0); y.push_back(w-w);

for (int i = 0; i < rects.size(); i++)

for (int i = 0; i < x.size(); i++)

if (cal < ans) ans = cal;}}

return ans;

}

itint5 直角路線遍歷棋盤

這題一開始直接用暴力的dfs來做,果然到25的規模就掛了.vectorvisited 50,false vector vec row 50 vector vec col 50 bool findpath vector x,vector y,int idx,int depth,int directio...

itint5 字串匹配

用hash來做,目前為止做到最好也是case16超時 20w的規模 即使分桶也超時。注意計算hashcode時,a 要算成1,否則如果 a 為0,那麼 aa 和 a 是一樣的。下面是超時的 define bucket 65535 define ulong long long vector uset ...

5 子視窗呼叫父視窗 視窗 (5)

在圖7.10中我們看到,自從9月份的一根上吊線以及後面的一根黑色吞沒蠟燭線 覆蓋的就是這根上吊線 出現後,市場便一路 9月末,市場形成了乙個視窗,它表明 還將繼續。後來,這個視窗被關閉了,但是買進的動力隨即煙消雲散。這一點從圖示的流星形態上得到了證實。在圖7.11中,我們要討論3個視窗。視窗1形成於...