zoukankan      html  css  js  c++  java
  • Pongo建立信号基站-实际上还是考中位数

    题目:

    要建立一个信号基站服务n个村庄,这n个村庄用平面上的n个点表示。假设基站建立的位置在(X,Y),则它对某个村庄(x,y)的距离为max{|X – x|, |Y – y|}, 其中| |表示绝对值,我们的目标是让所有村庄到信号基站的距离和最小。 基站可以建立在任何实数坐标位置上,也可以与某村庄重合。

    输入: 给定每个村庄的位置x[],y[],x,y都是整数,满足:            -1000000000 < x,y < 1000000000 村庄个数大于1,小于101。

    输出: 所有村庄到信号基站的距离和的最小值。 关于精度: 因为输出是double。我们这样判断对错,如果标准答案是A,你的答案是a,如果|A – a| < 1e-3 我们认为是正确的,否则认为是错误的。 样例: 假设有4个村庄位置分别为 (1,4) (2,3) (0,1) (1,1) 我们的结果是5。因为我们可以选择(1.5,2.5)来建立信号基站。 bestDistance = max(|1.5-1|, |2.5-4|) + max(|1.5-2|,|2.5-3|) + max(|1.5-0|,|2.5-1|) + max(|1.5-1|,|2.5-1|) = max(0.5, 1.5) + max(0.5,0.5) + max(1.5,1.5) + max(0.5,1.5) = 1.5 + 0.5 + 1.5 + 1.5 = 5

    函数头部: C/C++ double bestDistance(int n, cons int *x, const int *y); Java class Main() {     public static double bestDistance(int [] x,int [] y); } 

    解题:

    关键在于如何处理max{|X – x|, |Y – y|},可以通过分段函数讨论来证明,max{|x1-x2|,|y1-y2|},等价于(|x1+y1-x2-y2|+|x1-y1-(x2-y2)|)/2;

    这个问题转化后,就变成(|x1+y1-(x2+y2)|+|x1-y1-(x2-y2)|)/2;=》(|U-U0|+|V-V0|)/2,很明显U和V,直接求出来,就是求和求差。那下面的问题就是前面一篇博客所讲:

    http://blog.csdn.net/zhang20072844/article/details/13372753

    代码:

    __int64 getMinDis(__int64 a[],__int64 N)  
    {  
    	sort(a,a+N);  
    	int l = 0,r = N - 1;  
    	__int64 sum = 0;  
    	while (l <= r)  
    	{  
    		sum += a[r --] - a[l ++];  
    	}  
    	return sum;  
    }  
    
    double bestDistance(int n,const int *x,const int *y)
    {
    	__int64 aAndY[110],aSubY[110];
    	for (int i = 0; i < n; ++ i)
    	{
    		aAndY[i] = x[i]+y[i];
    		aSubY[i] = x[i]-y[i];
    	}
    	return (getMinDis(aAndY,n)+getMinDis(aSubY,n))/2.0;
    }


  • 相关阅读:
    IDA断点和搜索
    shell grep正则匹配汉字
    吐槽一下jsoup
    mysql函数
    hutools之批量更新
    Hutools之http工具类
    Java通过腾讯邮箱发送邮件
    访问网络资源的方式--application/json和x-www-form-urlencoded
    HttpClient获取数据
    URLConnection类的使用
  • 原文地址:https://www.cnblogs.com/riskyer/p/3395190.html
Copyright © 2011-2022 走看看