题目3 : 活动中心

时间限制:12000ms

单点时限:6000ms

内存限制:256MB

描写叙述

A市是一个高度规划的城市,可是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心。方便居住在A市的居民们能随时开展运动,锻炼强健的身心。

城市规划局希望活动中心的位置满足下面条件:1. 到全部居住地的总距离最小。

2. 为了方便活动中心的资源补给和其它器材的维护。活动中心必须建设在A市的主干道上。

为了简化问题。我们将A市摆在二维平面上,城市的主干道看作直角坐标系平的X轴,城市中全部的居住地都能够看成二维平面上的一个点。如今,A市的城市规划局希望知道活动中心建在哪儿最好。

输入

第一行包含一个数T,表示数据的组数。

接下来包括T组数据。每组数据的第一行包括一个整数N。表示A市共同拥有N处居住地

接下来N行表示每处居住地的坐标。

输出

对于每组数据,输出一行“Case X: Y”。当中X表示每组数据的编号(从1開始),Y表示活动中心的最优建造位置。我们建议你的输出保留Y到小数点后6位或以上,不论什么与标准答案的绝对误差或者相对误差在10-6以内的结果都将被视为正确。

数据范围

小数据:1 ≤ T ≤ 1000, 1 ≤ N ≤ 10

大数据:1 ≤ T ≤ 10, 1 ≤ N ≤ 105

对于全部数据,坐标值都是整数且绝对值都不超过106

例子解释

例子1:活动中心的最优建造位置为(1.678787, 0)

例子输入

    1

    3

    1 1

    2 2

    3 3

例子输出

    Case 1: 1.678787

 

题解

       本题是一道简单题,直接三分找极小值点就可以。三分+暴力枚举,在此不多说了。至于可能解不唯一。我是尽量取小的,感觉測试数据非常水的。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

const int MAXN=100000+100;
const double eps=1e-8;
struct Point
{
int x,y;
}myPoint[MAXN];
int n;

double GetDis(double st)
{
double ans=0;
for(int i=0;i<n;i++)
ans+=sqrt((1.0*myPoint[i].x-st)*(1.0*myPoint[i].x-st)+1.0*myPoint[i].y*myPoint[i].y);
return ans;
}

int main()
{
int cas,i,tag=0;
double minX,maxX;
cin>>cas;
while(cas--)
{
scanf("%d",&n);
minX=100000000.0;
maxX=-100000000.0;
for(i=0;i<n;i++)
{
scanf("%d%d",&myPoint[i].x,&myPoint[i].y);
if(minX>myPoint[i].x)
minX=myPoint[i].x;
if(maxX<myPoint[i].x)
maxX=myPoint[i].x;
}

double midl,midr,le,re,lme,rme;
while(maxX-minX>eps)
{
midl=(minX+maxX)/2;
midr=(midl+maxX)/2;
lme=GetDis(midl);
rme=GetDis(midr);
if(lme>rme)
minX=midl;
else maxX=midr;
}
printf("Case %d: %.6lf\n",++tag,maxX);
}
return 0;
}