一類老鼠進洞模型

2022-04-29 19:48:13 字數 1039 閱讀 9673

給定乙個序列,序列上有若干\(mouse\)和若干\(hole\),求一組最優的\(mouse\)和\(hole\)的匹配。

定義乙隻\(mouse\)跑到乙個洞\(hole\)的代價為兩點之間的距離。

每乙個洞不一定要進老鼠,但每乙個老鼠一定要進乙個洞。

結論一:匹配不會交叉。(顯然)

結論二:對於一組匹配,老鼠和洞不會同時反悔。(從左往右進行匹配,同時反悔會產生交叉)

然後就可以用堆模擬費用流啦。

對老鼠和洞分別維護乙個堆,設老鼠堆為\(q_1\),洞的堆為\(q_2\),表示增廣集合。

方便起見先往\(q_2\)中放乙個代價為\(inf\)、容量為\(inf\)的洞。

直接這樣\(q_1\)的複雜度顯然是假的,老鼠進堆的複雜度沒有保障。

但是注意到老鼠反悔的代價都是\(-w + val = -x - cost\),都是一樣的所以可以只扔一次。

記錄一下這個洞匹配的老鼠個數\(cnt\),這樣每個洞就只會往老鼠堆中扔一次啦!

我們已經知道老鼠和洞不會同時反悔,所以直接把這兩種反悔都扔到對應堆中即可。

**實現相當簡單:

q2.push((item)) ; ans = 0 ;

item u ; ll t , w , fl , cnt ;

for(int i = 1; i <= n; i ++) ) ;

} else ) ;

} if(p[i].cap > 0) q2.push((item)) ;

if(cnt > 0) q1.push((item)) ; }}

cout << ans << endl ; return 0 ;

堆模擬費用流,但複雜度沒***。

對老鼠和洞都進行兩種反悔(即老鼠和洞都使用問題二中洞的反悔方式)。

常見轉換有:若乙個洞必須進老鼠、或者乙隻老鼠必須進洞,那麼就把它的代價賦為\(-inf\)。

部分問題的特殊性質可以保證複雜度,其他情況下作為乙個暴力演算法還是很優秀的。

Leetcode Sum一類題目

leetcode裡有一類這樣的題目,給定乙個陣列和乙個target值,尋找陣列中的幾個數相加等於target值。1 two sum,尋找陣列中兩個數相加等於target值 2 three sum,尋找陣列中三個數相加等於target值 3 four sum,尋找陣列中四個數相加等於target值 注...

物件導向(一) 類

class class nameobject name 乙個或者幾個物件的標識 class crectanglerect 是crectangle型別的物件的名稱 crectangle 和 rect的關係就像 int 和變數a的物件一樣 int 型別名 a 物件名,變數 如果物件需要呼叫類裡面的函式,...

一 類與物件

物件的儲存細節 程式啟動,先把程式載入到 區。系統自動建立乙個類物件,載入類中的物件方法列表。當通過乙個類建立物件時,先在堆中開闢一塊儲存空間給物件p,再初始化物件的各屬性為0,最後返回乙個位址儲存到棧中 區域性變數接收 物件的第0個屬性是系統建立的isa指標,指向建立該物件的類。類方法只能類呼叫,...