zoukankan      html  css  js  c++  java
  • 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; 
    }
    

      

  • 相关阅读:
    WebService安全 文件夹 目录安全性 身份验证与访问控制
    爱情故事[转载自:学狼网]
    未来中国最受宠的人才
    [引]SQL Server : 系统存储过程
    VS 安装项目 :通过文本框得到用户输入 以及 安装后运行某程序(如打开C:\\a.html)
    人人都能成为百万富翁
    成功原来这样简单
    精典谚语
    利用WinForm 更好的实现Web安装程序的更多功能
    升级安装包的制作
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/7718637.html
Copyright © 2011-2022 走看看