牛牛战队的比赛地(三分法)
问题描述:
由于牛牛战队经常要外出比赛,因此在全国各地建立了很多训练基地,每一个基地都有一个坐标(x,y)(x,y)。
这周末,牛牛队又要出去比赛了,各个比赛的赛点都在xx轴上。牛牛战队为了方便比赛,想找一个到达训练基地最大距离最小的地方作为比赛地。
这个问题对于牛牛战队太简单了,它就交给了你,你来帮他算一下~
问题分析:
枚举x上所有的点,如何枚举呢?从x轴最左边点往右走的时候函数值必然越来越小,当过了某个函数值极小的点时继续向右走时,函数值又开始越来越大,单谷函数。三分法解决。
代码实现:
#include <iostream>
#include<math.h>
using namespace std;
typedef struct Point{
int x,y;
}Point;
Point point[100005];
int N;
double check(double x)
{
double max=-1;
int i;
for(i=0;i<N;i++)
{
double temp=sqrt((x-point[i].x)*(x-point[i].x)+point[i].y*point[i].y);
if(temp>max)
max=temp;
}
return max;
}
int main(int argc, char *argv[]) {
int i;
double left=-10000,right=10000,lmid,rmid;
cin>>N;
for(i=0;i<N;i++)
cin>>point[i].x>>point[i].y;
for(i=0;i<100;i++)
{
lmid=(left+right)/2;
rmid=(lmid+right)/2;
if(check(lmid)<=check(rmid))
right=rmid;
else
left=lmid;
}
cout<<check(left);
return 0;
}