HDU 5073 Galaxy
題意:
數軸上有n個點 每個點重量1 可以移動其中k個到任何位置 使得題中式子值最小 di表示第i個點距離現在n個點的重心的距離
思路:
式子中wi可以去掉 因為都是1 則 式子變成I=min(sum(di*di))
考慮移動的k個點 應該直接把它們移到重心 這樣di為0
很容易想到 我們將所有點排序後 應該從兩邊往中間拿 這樣移動k個點 剩下一些連續的點 因此可以枚舉剩下的連續區間
此時我們把I變形 I = min(sum(di*di))
= min(sum((li-mi)*(li-mi))) (li即i點的位置 mi為這幾個點的重心)
= min( sum(li*li) - 2*mi*sum(li) + mi*mi*(n-k) )
這樣我們可以用前綴和來維護答案 結合上面的枚舉 復雜度也就是O(n)
代碼:
#include
#include
#include
#include
#include
#include