标签:size style 表示 panel std 取值 eof ber min
hihocoder-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; }
标签:size style 表示 panel std 取值 eof ber min
原文地址:http://www.cnblogs.com/zhang-yd/p/7718637.html