描述
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 <stdio.h>
#include <fstream>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <map>
#define PI acos(-1.0)
#define M 1000005 //10^6
#define eps 1e-8
#define moo 1000000007
using namespace std;
double a[M];
double b[M];
int n;
double find(double x)
{
double ans=0;
for(int i=1;i<=n;i++)
ans=ans+sqrt((a[i]-x)*(a[i]-x)+b[i]*b[i]);
return ans;
}
int main()
{
int T;
scanf("%d",&T);
int dd=T;
while(T--)
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&a[i],&b[i]);
}
double le=-1000000;
double ri=1000000;
while(ri-le>eps)
{
double mid=(le+ri)/2;
double miid=(mid+ri)/2;
double an1=find(mid);
double an2=find(miid);
if(an1<an2)
ri=miid;
else
le=mid;
}
printf("Case %d: %.6f\n",dd-T,le);
}
}