1. 程式人生 > 實用技巧 >Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

  • 題意:在二維座標軸上給你一堆點,在x軸上找一個點,使得該點到其他點的最大距離最小.

  • 題解:隨便找幾個點畫個圖,不難發現,答案具有凹凸性,有極小值,所以我們直接三分來找即可.

  • 程式碼

    int n;
    long double x[N],y[N];
     
    long double check(long double s){
        long double res=0;
        long double tmp;
        for(int i=1;i<=n;++i){
            tmp=sqrt((s-x[i])*(s-x[i])+(y[i]*y[i]));
            if(res<tmp) res=tmp;
        }
        return res;
    }
     
    int main() {
        while(scanf("%d",&n)!=EOF){
            if(n==0) break;
            for(int i=1;i<=n;++i){
                scanf("%Lf %Lf",&x[i],&y[i]);
            }
            long double l=-200000,r=200000;
            long double lmid,rmid;
            while(l+eps<r){
                lmid=l+(r-l)/3;
                rmid=r-(r-l)/3;
                if(check(lmid)<check(rmid)) r=rmid;
                else l=lmid;
            }
            printf("%Lf %Lf\n",rmid,check(lmid));
        }
     
        return 0;
    }