乘積最小問題

2022-10-08 16:24:12 字數 2002 閱讀 8497

乘積最小問題

今天看到三個這樣的題

最小乘積生成樹,$hnoi2014$畫框,不講武德

大概就是乙個物品有兩種特徵值$a,b$,他的代價是$(\sum a)\times(\sum b)$

$p5540$最小乘積生成樹

第一感覺這種題和$wqs$二分有點關係,結果發現沒有什麼關係...

這種題都是一種套路吧,第一次見的話很難想到

暴力的話就是找出所有生成樹求個最小值

考慮求出所有生成樹,這個生成樹有兩個屬性$\sum a, \sum b$

我們要找乙個二維座標軸上$(x,y)[min(x\times y)]$

那麼這個東西考慮怎麼得到,考場上想到乙個東西,能不能分別找兩部分的最小值,然後搞一下合併之類的,發現這個思路被合併卡住了,但是對正解有一定啟發意義

正解:$step1:$

求出與$x/y$軸距離最近的點,也很好找吧,畢竟直接對兩個屬性分別求乙個最小生成樹就好了m設兩點分別是$a,b$

考慮最優點在哪啊,首先$a\times b$可以看成矩陣面積吧,那麼距離原點越近越小

其實把所有點在二維平面上表示出來,最小的必然在下凸殼上,不在下凸殼上必然是不優的

那麼又有了$ab,$那麼最小值又能進一步確定在$ab$左下方

最後維護出來的大概是這個東西

證明,假設最優點在$b$右側,那麼由於斜率增大,感性想一下,乙個增大的多,乙個減小的少,那麼不會更優

或者面積最是$k,y=\frac$,只要我有點腦子就會發現這個必然在裡面較優

$step2:$

找到乙個在$ab$左下方距離$ab$最遠的點,這個時候還不是最優解,那我們需要找最優解

顯然的,最優點必然在直線$ab$靠近原點的一側,那麼就把在這裡面的點都搞出來取$\min$就好了(扯)

首先怎麼找到距離$ab$左下方最遠點(不一定是最優點),最遠點就是面積最大的點,因為底邊確定

最小化$ab\times ac$即可,首先$a,b$已知

$ab\times ac=(x_b-x_a)y_c+(y_a-y_b)x_c-(x_b-x_a)y_a+(y_b-y_a)x_a$

那麼就將前兩項最小化就好了(狂暴吐槽洛谷此題第一篇題解),那麼把邊權設為前面兩項的和求乙個最小生成樹就好了

那麼我們可以愉快的認為,我們只需要找到$ab$下面的所有點就好了,至於這個東西可以一步步縮小範圍,就是相當於一點一點確定凸包就好了,我們可以根據這個東西找到所有凸包上的點了

$step3:$

遞迴處理

$p3236$畫框

一樣的套路,分別找到第乙個最小的和第二個最小的,然後放到二維平面上,然後繼續得出一樣的式子

這個東西可以搞乙個二分圖帶權最小匹配(小常數費用流可以沖一沖),這道題也就完了

$loj3412$不講武德

如果說前兩道題是入門的話,這道題就是$ex_}$了

首先可以愉快的$2^n$列舉直接獲得$10pts$的優異成績

這時候前面的題就有用了

列舉$k$,然後找到$k$個元素的兩個屬性分別最小的不成環集合,然後推式子找到凸殼上的點,這個時候把每個邊附上新的權值重新跑一遍,遞迴處理

這個題就是找到乙個新的集合,也是新的式子的最小值,繼續遞迴處理,目前共得到$50pts$

考慮一下剛剛那個重新計算代價的式子

$a_i(r_y-l_y)-b_i(r_x-l_x)$化簡式子為$a_i-b_ik$的形式

那麼顯然每個點$a,b$已知,這個就是乙個一次函式的形式,然後這是$m$條直線,至多有$m^2$個交點,那麼本質不同的範圍只有$m^2$個,直接全處理出來就好了

然而上面的並沒有考慮是樹還是圖,不是樹顯然就寄了

不是樹的話,就考慮最小生成樹演算法,對於剛才那個是選前$k$個就好了

然而現在不能成環了,還是能搞乙個交換關係

那麼還是說維護直線交點,這個就是在交點位置維護最小生成樹就好了$+15pts$

到了這就是正解了,一些證明就是最小生成樹交換次數問題了

路徑最小問題

問題 給你乙個二維陣列,二維陣列中的每個數都是正數,要求從左上角走到右下角,每一步只能向右或者向下。沿途經過的數字要累加起來。返回最小的路徑 經典的動態規劃問題 請記住這樣一句話 每乙個優美的動態規劃,都來自原先暴力的嘗試 package class 08 public class code 07 ...

字典序最小問題

給定長度為n的字串s,要構造乙個長度為n的字串t。起初,t 是乙個空串,隨後反覆進行下列 任意 操作。1 從 s 的頭部 刪除乙個 字元,加到 t的 尾部 2 從 s 的尾部 刪除乙個 字元,加到 t 的 尾部 你的 目標是 要構造字典序盡可能小的字串 t。s 只包含大寫英文本母 輸入10 asdf...

簡單的最大最小問題

例表tb id price netprice 1 8.00 20.00 2 10.00 5.00 3 0.00 3.00 我想要查出price與netprice之間大的列 比如查出如下資料 id newprice 1 20.00 2 10.00 3 3.00 sql語句要怎麼寫?create tab...