演算法競賽高階指南 0x05(排序)倉庫選址

2021-10-21 14:51:38 字數 927 閱讀 9386

倉庫選址:貪心經典問題,選取中位數即為倉庫的最優位置

證明:如圖,我們可以推出公式,然後變形,為了使 d 最小,那麼讓》=變成等於就是最優解,我們發現,對於(|x1-x|+|xn-x|),只有x在x1—xn中間(圖中2的位置)就變成了xn-x1,也就是最優解。在看第二個式子,(|x2-x|+|xn-1-x|),最優位置也是在x2—xn-1中間,我們發現這兩個最優位置並不衝突,那麼對於所有的式子都滿足,那麼我們發現這個中間位置就是所有倉庫的中間,也就是倉庫位置的中位數。

倉庫個數問題:對於n是奇數,那麼中位數只有乙個,倉庫的最優位置也只有乙個;對於n是偶數,那麼中位數就有兩個,a[n/2]和a[n/2-1],那麼倉庫的個數就有a[n/2]-a[n/2-1]+1個(在中位數之間包括中位數都是倉庫的最優位置)

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e5+10;

int n;

int a[n]

;int

main()

lyd讀書筆記 0x05 排序(下)

終於看到了完結的曙光。話說我規劃今天做後面的題誒。隨機選取乙個數,將比它大的放在左邊,小的放在右邊,設有cn t cnt 個比它小的,k cnt k c nt 就在左半段找,否則去右半段。這樣遞迴即可,複雜度o n o n 萬能的stl有nth element include using names...

演算法競賽高階指南 0x00

快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...

演算法競賽高階指南 0x12 最大子序和

這其實是一道單調佇列優化區間dp問題,對於這個序列,我們可以劃分為n個區間,每個區間代表以ai結尾,長度不超過m的子串行和,我們只需要遍歷一遍每個集合,找到每乙個集合中的最大值,那麼就可以更新出這個序列的最大值 如何找每個集合中的最大值呢,最大值就是要求出以a k 結尾,長度不超過m的子串行和最大,...