现在的位置: 首页 > 综合 > 正文

编程之美-活动中心(三分)

2014年09月05日 ⁄ 综合 ⁄ 共 1469字 ⁄ 字号 评论关闭

题目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;
}

 

抱歉!评论已关闭.