hihocoder-1595-Numbers

hihocoder-1595-Numbers

#1595 : Numbers

时间限制:8000ms
单点时限:1000ms
内存限制:256MB

描述

给定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
", ans);

	return 0; 
}

  

原文地址:https://www.cnblogs.com/zhang-yd/p/7718637.html