現在有乙個長度為n的陣列a,另外還有乙個整數k。陣列下標從1開始。
現在你需要把陣列的順序重新排列一下使得下面這個的式子的值盡可能小。
特別的,你也可以不對陣列進行重新排列。
單組測試資料。第一行包含兩個整數n,k (2≤n≤3*10^5, 1≤k≤min(5000,n-1))。
第二行包含n個整數 a[1],a[2],...,a[n] (-10^9≤a[i]≤10^9)。
輸出答案佔一行。
3 211 2 4
這題一看題就是把陣列分成了k組,k組分別怎麼排列後求
,然後求k組之和最小,k組裡面有n%k組有n/k + 1 個數,有k - n %k 個有n/k個,乙個組內部怎樣最小當然是按從小到大排最小,內部可以消掉,之等於最大值減最小值,所以所有的數排序,求怎樣劃分成k組能使和最小。dp方程(i表示有n/k個數):dp[i][j] = min(dp[i-1][j] + a[i * (n/k) + j * (n/k + 1) -1] - a[(i-1) * (n/k) + j * (n/k + 1) -1],dp[i][j-1]+a[i * (n/k) + j * (n/k + 1) -1] - a[i * (n/k) + (j -1)* (n/k + 1) -1],);
1 #include2 #include3 #include4#define maxn 300001
5#define inf 1<<30
6using
namespace
std;78
int dp[5001][5001];9
inta[maxn];
1011
intmain()
1234 printf("
%d\n
",dp[x1][x2]);
35return0;
36 }
51Nod 1510 最小化序列
acm模版 這個題,打眼一看就是貪心,然後我就貪心寫了一下,wa 了三分之一,分析了一下,感覺只是貪心不行,還有 dp 搞搞才行 首先,貪心的思路是,我們需要將資料分為 k 組,其中有 n k組的大小為 nk 1,剩下的 k n k 組有 nk 個。這個好理解,就不多說了,接著我們要將序列排序,因為...
1097 拼成最小的數(構造最小序列,貪心)
設有n個正整數,將它們聯接成一排,組成乙個最小的多位整數。例如 n 2時,2個整數32,321連線成的最小整數為 32132,n 4時,4個整數55,31,312,33 聯接成的最小整數為 312313355 收起第1行 1個數n。2 n 10000 第2 n 1行 每行1個正整數。1 a i 10...
字典序最小的子串行 51Nod 1255
記錄每個字母出現的最早和最晚位置 然後掃一遍 維護乙個單調棧 但是並不只考慮字母大小 還要考慮出現最早最晚位置 如果當前字母比棧頂元素小 並且棧頂元素在在之後還會出現 那就換掉這個棧頂 include using namespace std const int maxn 1e5 10 const i...