通讯基站

某国有 ​N个军事基地,每一个军事基地的位置可以由二维坐标平面上的一个点 ​(x,y)表示。现在,这个国家的元首希望建立一个军事通讯基站。由于某些原因,这个军事通讯基站只能建立在 ​x轴上的某个位置。现在,元首想要知道,新建立的基站到这 ​N个军事基地的最大距离的最小值是多少。

输入描述

输入第一行输入一个整数 ​N [1,100 000],表示军事基地的数量。

接下来 ​N 行,每行包含两个以空格分隔的整数 x,y ​[-10 000,10 000],表示每一个军事基地的位置坐标。

输出描述

输出一个保留到小数点后4​位的小数表示答案。

样例说明

对于给出的样例,通讯基站建立在 ​(0,0)处时其到三个军事基地的距离最大值为2 ​。可以证明 ​2为可能的最小值。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 3↵
  2. 0 0↵
  3. 2 0↵
  4. 0 2↵
以文本方式显示
  1. 2.0000↵
1秒 64M 0
#include<stdio.h>  
#include<stdlib.h>  
#include<math.h>  
  
double measure(double x,float p[][2],int n)  
{  
    int i;  
    double d=0,maxd=0;  
    for(i=0;i<n;i++)  
    {  
        d=sqrt(pow(p[i][0]-x,2)+pow(p[i][1],2));  
        if(d>maxd) maxd=d;  
    }  
    return maxd;  
}  
int main(){  
    int n,i;  
    scanf("%d",&n);  
    float p[n][2];  
    for(i=0;i<n;i++) scanf("%f %f",&p[i][0],&p[i][1]);  
    double mind=0,x;  
    double right=-10000,left=10000,midl,midr;  
    while(left-right>1e-6)  
    {  
        midl=(right+left)/2;  
        midr=(right+midl)/2;  
        if(measure(midl,p,n)<measure(midr,p,n)) right=midr;  
        else left=midl;  
    }  
    //printf("%.4f\n",left);  
    printf("%.4f\n",measure(left,p,n));  
}  
发布了28 篇原创文章 · 获赞 2 · 访问量 590

猜你喜欢

转载自blog.csdn.net/CN_BIT/article/details/104651155