【題意】給定乙個長度為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 中的任何乙個元素。那麼假設高度為權值,...