階段1 動態規劃 對頂堆

2021-10-10 03:10:00 字數 1013 閱讀 3509

【題意】

給定乙個長度為n的整數陣列a,你需要建立另乙個長度為n的整數陣列b,陣列b被分為k個連續的部分,並且如果i和j在同乙個部分,則b[i]=b[j]。

如果要求陣列b能夠滿足σ|a[i]-b[i]|最小,那麼最小值是多少,請你輸出這個最小值。

【輸入格式】

輸入包含多組測試資料。

對於每組測試資料,第一行包含兩個整數n和k。

接下來n行每行包含乙個整數,表示完整的陣列a。

當輸入為一行0 0時,表示輸入終止。

【輸出格式】

對於每組資料,輸出乙個最小值。

每個結果佔一行。

【資料範圍】

1≤n≤2000,

1≤k≤25,k≤n,

陣列a中元素的絕對值不超過10000。

【輸入樣例】

7 2654

3217

0 0【輸出樣例】

9

#include#include#include#includeusing namespace std;

typedef long long ll;

ll n,m,totd,totx,sumd,sumx;

ll hd[2100],hx[2100];

ll a[2100],s[2100][2100];

ll f[2100][31];

inline void clean()

inline void reclear()

inline void sswap(ll &x,ll &y)

inline void chada(ll x)

else break; }}

inline void shanxiao()

}inline ll mymin(ll x,ll y)

while(totd=0;j--)

}} printf("%lld\n",f[n][m]);

} return 0;

}

對頂堆(動態維護第k大 小)

對於動態維護第k小的問題,可以用乙個size為k的大根堆,來維護,大根堆的頂部元素即第k小元素,維護大根堆需要乙個小根堆,由小根堆向大根堆傳遞元素,即對頂堆。若當前大根堆size為k,第k 1小元素即小根堆的頂部元素 題目描述 保證b為增序 ac include include include in...

對頂堆的故事

總結 用大頂堆和小頂堆來實現,控制兩個堆的個數來實現將第幾個數暴露在兩個堆的中間,這樣就可以隨時輸出第幾個數,隨意以乙個頂堆的top 為標準,判斷下乙個數加在哪個堆裡,並時刻控制數量,這樣就可以將要求的第幾個數一直存疑兩個頂堆的top 之間。include include using namespa...

對頂堆學習筆記

處理動態中位數等問題,靈活運用了堆的性質,本質是維護兩個堆。大根堆 q 1 維護集合中較小值的部分的最大值。小根堆 q 2 維護集合中較大值的部分的最小值。注意到兩個堆中的元素各自是單調的,兩個堆間也是單調的。也就是說,q 1 中的任何乙個元素都不大於 q 2 中的任何乙個元素。那麼假設高度為權值,...