題目3 : 活動中心

編程之美2014初賽第一場第三題

時間限制: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 <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);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章