倉庫選址:貪心經典問題,選取中位數即為倉庫的最優位置證明:如圖,我們可以推出公式,然後變形,為了使 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的子串行和最大,...