题目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 ",++tag,maxX); } return 0; }