1. 程式人生 > 其它 >P3049 [USACO12MAR]Landscaping S

P3049 [USACO12MAR]Landscaping S

這篇部落格我要單獨寫!

思想:貪心的把到當前位置先補齊


假設:i,j,k,p是位置
i    j    k    p
少   多   少    多

------------------------------------------------------------
i位置缺少
第0步:
花費x

------------------------------------------------------------
j位置是多出來,如果轉移更優,則滿足
(j - i) * z  < x(把i位置及填滿需要這麼多錢) + y(把j位置多的去掉需要這麼多)

“把j位置多的去掉的更少花費”
v = (j-i)*z - x

觀察
v = (j-i) * z - x
  = j*z - (x + i*z) //括號裡的和什麼相關:
                    //1.i位置填滿需要的花費,2.i位置(i*z)
v累加進答案中

這裡先不說完整的做法,繼續推理,從下面的推導過程讓“最終的方法”付出水面
------------------------------------------------------------
k位置是缺少的,如果轉移更優,則滿足

(k - j) * z < v(把j位置多的去掉的更少花費) + x(把k位置填滿)

//把k位置填滿的更少花費
w = (k - j) * z - v
  = k*z - (v + j*z)//括號裡的和什麼相關:1.j位置去掉需要的花費,2.j位置有關(j*z)

找到規律:選擇前面“多餘”的位置中最大的 "花費 + 位置*z",進行交換

累加進答案中,並且 k*z + w 放入“缺少”大根堆

如果轉移不優,則
(k - j) * z > v(把j位置多的去掉的更少花費) + x(把k位置填滿)
則把x累加到答案中

k*z + x 放入大根堆
------------------------------------------------------------
p位置是多出來的,如果轉移更優,則滿足
(p - k) * z <  w(把k位置填滿的更少花費) + y(p位置去掉)

r = (p - k) * z - w
  = p * z - (k*z + w) //括號裡的和什麼相關:1.k位置填滿需要的花費,2.k位置有關(k*z)

找到規律:選擇前面“缺少”的位置中最大的"花費 + 位置*z",進行交換

累加進答案中,並且 p*z + r 放入"多餘"大根堆