hihocoder-1595-Numbers
#1595 : Numbers
描述
给定n个整数常数c[1], c[2], ..., c[n]和一个整数k。现在需要给2k个整数变量x[1], x[2], ..., x[k], y[1], y[2], ..., y[k]赋值,满足
(1)对于所有1 ≤ i ≤ k,都有x[i] ≤ y[i]。
(2)对于所有1 ≤ i ≤ n,都存在至少一个j (1 ≤ j ≤ k),使得x[j] ≤ c[i] ≤ y[j]。
求出S=(y[1] + y[2] + ... + y[k]) - (x[1] + x[2] + ... + x[k])的最小值。
输入
第一行两个整数n, k。(1 ≤ n, k ≤ 100000)
接下来n行,每行一个整数c[i]。 (-1000000000 ≤ c[i] ≤ 1000000000)
输出
输出一个整数表示S的最小值。
样例解释
x[1]=-5, y[1]=4,
x[2]=10, y[2]=10.
-
样例输入
-
5 2 -5 0 10 4 0
样例输出
-
9
贪心
根据题意:
就是要 x, y 覆盖所有的C,所以 S = sum (y ) - sum(x) , 其最大值就是 max(C) - min(C) , C数组的跨域。
然后要每一个c[i] 都有x, 和 y 相夹,那么,如果有两个 x 和 y, 则 x[0] = min(C), y[1] = max(C), x[1], 和 y[0] 的取值,应该在 C数组内部的最大gap里面取得即可。
#include <cstdio>
#include <cstdlib>
const int MAXN = 100000 + 10;
int n, num[MAXN], gap[MAXN];
int cmp(const void *a, const void *b){
return (*(int *)a - *(int *)b);
}
int main(){
freopen("in.txt", "r", stdin);
int n, m;
scanf("%d %d", &n, &m);
for(int i=0; i<n; ++i){
scanf("%d", &num[i]);
}
qsort(num, n, sizeof(num[0]), cmp);
for(int i=0; i<n-1; ++i){
gap[i] = num[i+1] - num[i];
}
qsort(gap, n-1, sizeof(gap[0]), cmp);
int ans = num[n-1] - num[0];
for(int i=0; i<m-1 && i<n; ++i){
ans -= gap[n-2-i];
}
printf("%d\n", ans);
return 0;
}